考慮下面的代碼:右值引用,指針和拷貝構造函數
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引用來將它分配給Foo::ptr
而不直接訪問這個指針並複製?
你寫的代碼不會導致任何問題(除了內存泄漏,並不實際編譯)。那是你正在使用的實際代碼嗎? –
它編譯好**和**運行良好:http://ideone.com/Ypqxz – Nawaz
這確切的代碼似乎在Visual Studio 2010中正常工作(儘管存在內存泄漏)。你確定你的編譯器版本是否符合右值引用? – Chad