이 고려 결과 :가 미리 계산하고 계산 된 온 - 더 - 플라이 허용 둘은
template <typename T>
struct C {
std::vector<int> f(const T &t) const {
return t.f();
}
};
T::f
필요한 벡터를 계산해야합니다. 그러나 일부 T
은 벡터를 미리 계산하므로 이러한 경우 복사본을 만들지 않는 것이 좋습니다. main
에서 주석이 로컬 변수에 대한 참조를 반환으로 T=A
를 들어, 위의 코드에 오류가, 알 수 있듯이
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;
}
: 여기 내 시도이다. T=A
과 T=B
을 모두 수용 할 수있어서 미리 계산 된 벡터 B::v_
이 복사되지 않습니까?
template <typename T>
struct C {
auto f(const T &t) const -> decltype(t.f()) {
return t.f();
}
};
이 값T = A
에 의해 를 반환하고, const&
T = B
의 :
코드가 컴파일되어 작동합니다. https://ideone.com/xedSqU – Zefick
@Zefick 작동하는 것으로 * 표시되지만 OP가 올바르게 지적 했으므로 UB 인 로컬 변수에 대한 참조를 반환합니다. –
왜 계산 된 벡터를 클래스 A에 저장할 수 없습니까? 복사 및 구문 문제를 모두 해결할 수 있습니다. – xinaiz