考虑以下代码
class MyClass
{
public:
MyClass( MyClass && );
template< typename ... T > MyClass( T&& ... );
};
Run Code Online (Sandbox Code Playgroud)
我如何区分这两个构造函数之间的调用?我可以专门设计模板来调用原始模板吗?
这是示例用例(这正是我在实际代码中所做的):
MyClass c( MyClass { } );
Run Code Online (Sandbox Code Playgroud)
从 C++17 开始
MyClass c( MyClass { } );
Run Code Online (Sandbox Code Playgroud)
总是会打电话
template< typename ... T > MyClass( T&& ... );
Run Code Online (Sandbox Code Playgroud)
这样做的原因是不再有临时对象。相反,初始化被省略,c直接从“临时”的初始化器构造。这意味着你现在真正拥有的是
MyClass c{};
Run Code Online (Sandbox Code Playgroud)
不过,这是一件好事,因为我们现在只是构建这是性能上的胜利,而不是构造和移动。