C++ 临时对象引用

C++ temporary object references

假设 MyClass 有一个以 int 作为参数的隐式构造函数,为什么 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) here)。因此,在第一种情况下 int 被传递给 tuple 构造函数,在那里构造一个临时的 MyClass,然后在该构造函数 returns 和 f 之前被销毁打电话。

在第二种情况下,MyClass 临时文件是在 main 中构造的,并且在 f 调用之后仍然存在。