gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 15:15:04 27 4
gpt4 key购买 nike

在下面的代码中,我为 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
}

最佳答案

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

12.8 Copying and moving class objects [class.copy]

9 If the definition of a class X does not explicitly declare a move constructor, one will be implicitly declared as defaulted if and only if

[...]

(9.4) -- X does not have a user-declared destructor.

如果生成移动构造函数,那么它比模板构造函数更适合移动。它不保存构造函数调用,它只是意味着调用了一个不同的构造函数,一个不打印任何内容的构造函数。

关于c++ - 为什么构造函数调用取决于默认析构函数的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35435255/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com