고려 다음 코드 조각 :를 rvalue 참조, 포인터, 복사 생성자
int three() {
return 3;
}
template <typename T>
class Foo {
private:
T* ptr;
public:
void bar(T& t) { ptr = new T(t); }
void bar(const T& t) { ptr = new T(t); }
void bar(T&& t) { (*ptr) = t; } // <--- Unsafe!
};
int main() {
Foo<int> foo;
int a = 3;
const int b = 3;
foo.bar(a); // <--- Calls Foo::bar(T& t)
foo.bar(b); // <--- Calls Foo::bar(const T& t)
foo.bar(three()); // <--- Calls Foo::bar(T&& t); Runs fine, but only if either of the other two are called first!
return 0;
}
내 질문에, 왜 세 번째 오버로드 Foo::bar(T&& t)
충돌 프로그램을 수행합니까? 정확히 여기서 무슨 일이 일어나고있는거야? 함수가 돌아온 후에 t
매개 변수가 파괴됩니까?
또한 템플릿 매개 변수 T
이 매우 큰 복사 생성자가있는 매우 큰 개체라고 가정 해 봅니다. RValue References를 사용하여이 포인터에 직접 액세스하고 복사본을 만들지 않고 Foo::ptr
에 할당 할 수 있습니까?
작성한 코드로 인해 메모리 누수가 발생하지 않고 실제로 컴파일되지 않는 등의 문제가 발생하지 않습니다. 그것이 실제 사용하고있는 코드입니까? –
잘 컴파일되고 ** 제대로 실행됩니다. http://ideone.com/Ypqxz – Nawaz
이 정확한 코드는 Visual Studio 2010에서 잘 작동하는 것으로 보입니다 (메모리 누수가 있음에도 불구하고). rvalue 참조와 관련하여 컴파일러 버전이 호환되는지 확실합니까? – Chad