选择要调用的构造函数

Picking a constructor to call

本文关键字:构造函数 调用 选择      更新时间:2023-10-16

考虑以下代码

class MyClass
{
public:
MyClass( MyClass && );
template< typename ... T > MyClass( T&& ... );
};

如何区分这两个构造函数之间的调用?我可以专门化模板化的模板,只调用原始模板吗?

以下是示例用例(这正是我在实际代码中所做的(:

MyClass c( MyClass { } );

在C++17 中启动

MyClass c( MyClass { } );

总是要呼叫

template< typename ... T > MyClass( T&& ... );

原因是不再有临时对象了。相反,初始化被省略,c直接从"临时"的初始化器构造而来。这意味着你现在真正拥有的是

MyClass c{};

不过,这是一件好事,因为我们现在只是构建,而不是构建和移动,这是性能上的胜利。

这是Nathans答案的附录,因为您还没有接受它。

#include <iostream>
class MyClass
{
public:
MyClass() {
std::cout << "defaultn";
}
MyClass(MyClass&& rhs) {
std::cout<< "movingn";
}
template<typename ... T >
MyClass(T&& ... ts) {
std::cout << "ctor templaten";
}
};
int main()
{ 
MyClass a(MyClass{});       // only default ctor, no move
std::cout << "---n";
MyClass b(MyClass{"bork"}); // only template ctor, no move
std::cout << "---n";
MyClass c = std::move(a);   // plain move
}

演示