为什么构造函数调用取决于默认析构函数的存在?

昆汀英国

在下面的代码中,我得到了的两个构造函数调用Test u = "u";但是,如果我注释掉析构函数,那么我只会得到一个构造函数调用。这是为什么?

#include <iostream>

template<class T>
auto operator<<(std::ostream& os, const T& t) -> decltype(t.print(os), os) 
{ 
    t.print(os); 
    return os; 
} 

class Test 
{
public:
    template<typename T>
    Test(T&& t)
    {
        std::cout << "Test " << t << '\n';
    }
    ~Test() = default; // if commented out removes one construction
    void print(std::ostream& os) const
    {
        os << "[with T = Test]";
    }
};

int main()
{
    Test u = "u"; // two constructors (second, a temporary, with T = Test)
    Test t("t"); // one constructor
}
用户名

用户声明的析构函数,即使它是默认的,也意味着不会生成任何move构造函数。

12.8复制和移动类对象[class.copy]

9如果一个类的定义X没有显式声明一个move构造函数,则当且仅当

[...]

(9.4)-X没有用户声明的析构函数。

如果生成了move构造函数,那么它比模板构造函数更适合移动。它不会保存构造函数调用,只是意味着将调用另一种构造函数,而该构造函数不会打印任何内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么析构函数比构造函数调用得更多?

为什么在构造时调用C ++类的析构函数?

从默认构造函数调用的成员的析构函数

为什么要调用析构函数

为什么不调用析构函数?

为什么析构函数被调用两次而构造函数仅被调用一次?

为什么类的默认构造函数和析构函数是内联的?

当析构函数调用构造函数时会发生什么?

为什么不能在析构函数可以的同时显式调用构造函数?

为什么std :: vector的构造函数调用自定义类的析构函数?

为对象分配值时为什么调用构造函数和析构函数

为什么默认的默认构造函数取决于它是在类内部还是外部声明?

为什么在Friend函数中调用析构函数

C ++为什么在堆栈中构造完对象后立即调用析构函数?

为什么 C++ 中类字段的默认初始化需要析构函数调用?

在派生类构造函数中引发异常。为什么调用基类析构函数而不是派生类析构函数?

当将对象作为参数传递时,为什么要调用析构函数但不调用构造函数?

为什么带有用户声明的析构函数的类具有隐式默认构造函数?

为什么不调用继承类的析构函数?

为什么在父类之前调用子类的析构函数?

为什么代码两次调用析构函数?

为什么我的类析构函数立即被调用?

为什么在执行复制之前调用析构函数?

为什么要调用派生类的析构函数?

为什么调用从对象移出的析构函数?

为什么析构函数被调用两次?

为什么析构函数调用两次表单?

为什么在复制分配期间调用析构函数?

为什么 C++ 线程多次调用析构函数?