假设MyClass
有一个将 anint
作为参数的隐式构造函数,为什么MyClass
在临时被销毁时显式构造与隐式构造之间存在差异?在一种情况下,它会导致悬空引用,而在另一种情况下则不会。
template <typename T>
void f(const T &x) {
cout << __PRETTY_FUNCTION__ << endl;
}
int main()
{
f(std::tuple<const MyClass &>(10));
cout << "---------------\n";
f(std::tuple<const MyClass &>(MyClass{}));
}
输出:
MyClass::MyClass(int)
MyClass::~MyClass()
void f(const T&) [with T = std::tuple<const MyClass&>]
---------------
MyClass::MyClass()
void f(const T&) [with T = std::tuple<const MyClass&>]
MyClass::~MyClass()
std::tuple
具有采用任意类型的模板化构造函数(此处为重载 (3) )。因此,在第一种情况下int
传递给tuple
构造函数,在MyClass
那里构造一个临时对象,然后在该构造函数返回时并在f
调用之前销毁。
在第二种情况下,MyClass
临时对象是在 中构造的main
,并且在f
调用后仍然存在。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句