C++ 临时对象引用

用户3882729

假设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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章