【问题标题】:C++ temporary object referencesC++ 临时对象引用
【发布时间】:2021-05-30 03:19:17
【问题描述】:

假设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()

【问题讨论】:

    标签: c++ stdtuple


    【解决方案1】:

    std::tuple 有一个采用任意类型的模板化构造函数(重载 (3) here)。因此,在第一种情况下,int 被传递给 tuple 构造函数,在那里构造一个临时的 MyClass,然后在该构造函数返回和调用 f 之前销毁。

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

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多