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
调用之后仍然存在。
假设 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
调用之后仍然存在。