考虑以下代码:
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
而不直接访问这个指针并制作副本?