Рассмотрим:позволяет как предварительно вычисленных и компьютерно на лету результаты
template <typename T>
struct C {
std::vector<int> f(const T &t) const {
return t.f();
}
};
T::f
необходимо вычислить требуемый вектор. Однако некоторые T
предварительно вычислили вектор, и мы хотели бы избежать создания копии в таком случае. Вот моя попытка:
struct A {
std::vector<int> f() const {
std::vector<int> res{10, 20, 30}; // computing the vector.
return res;
}
};
struct B {
const std::vector<int> &f() const {
return v_; // returning reference to pre-computed vector.
}
private:
std::vector<int> v_{1, 2, 3};
};
template <typename T>
struct C {
const std::vector<int> &f(const T &t) const {
return t.f();
}
};
int main() {
using T = B; // For A, we get an error about returning reference to a local.
C<T> c;
T t;
c.f(t);
return 0;
}
Как комментарий в main
указывает, для T=A
, приведенный выше код является ошибочным, как он возвращает ссылку на локальную переменную. Как я могу разместить как для T=A
, так и T=B
, так что предварительно вычисленный вектор B::v_
не копируется?
Ваш код скомпилирован и работает: https://ideone.com/xedSqU – Zefick
@Zefick Он только * появляется * для работы, но, как правильно указывает OP, он возвращает ссылку на локальную переменную, которая является UB. –
Почему вы не можете хранить вычисленный вектор в классе A? Вы решаете проблемы с копированием и синтаксисом. – xinaiz