这个模板ctor隐藏移动ctor吗?
class A {
public:
template<typename T>
A(T &&t);
// move would be as this:
/*
A(A &&a);
*/
};
Run Code Online (Sandbox Code Playgroud)
那么在这种情况下我应该如何实施移动ctor呢?它应该是默认语法A (A &&)还是模板专门化?
小智 5
接受的答案是不正确的.虽然确实:template <typename T> A(T &&t) { }不是移动构造函数,但您已经知道了.在这种情况下,编译器将隐式声明一个移动构造函数,正常的重载解析将按预期工作:
A a{2}; // calls template
A b = std::move(a); // calls move
A c{a}; // calls template
Run Code Online (Sandbox Code Playgroud)
即使模板构造函数不是"移动"构造函数,也没有什么可以阻止a被移入c.
根据标准(草案)
\n\n[类.副本]
\n\n\n\n\n3类 X 的非模板构造函数是移动构造函数,如果其第一个参数的类型为 X&&、const X&&、易失性 X&& 或 const 易失性 X&&,并且没有其他参数或所有其他参数都有默认参数 (8.3 .6). [ 示例:Y::Y(Y&&) 是移动构造函数。
\n
只有非模板构造函数可以是移动构造函数。同样适用于复制构造函数\xe2\x80\xa0。因此生成了隐式移动构造函数。
\n\n您可以按照通常的方式实现移动构造函数。专业化不起作用,因为重载决议首选隐式非模板移动构造函数。
\n\n\xe2\x80\xa0但是,如果参数类型与 不完全匹配const T&,则模板化引用将赢得重载决策。正如 Praveen 的例子所示,这种情况很容易发生。