具有通用引用的模板构造函数是否隐藏移动构造器?

Vic*_*voy 6 c++ c++11

这个模板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.

  • 你怎么知道提问者知道模板不算作移动构造函数?在接受的答案中,它在哪里隐含声明没有移动构造函数?(或者_"接受的答案是不正确的"_是指?) (3认同)

eer*_*ika 4

根据标准(草案)

\n\n

[类.副本]

\n\n
\n

3类 X 的非模板构造函数是移动构造函数,如果其第一个参数的类型为 X&&、const X&&、易失性 X&& 或 const 易失性 X&&,并且没有其他参数或所有其他参数都有默认参数 (8.3 .6). [ 示例:Y::Y(Y&&) 是移动构造函数。

\n
\n\n

只有非模板构造函数可以是移动构造函数。同样适用于复制构造函数\xe2\x80\xa0。因此生成了隐式移动构造函数。

\n\n

您可以按照通常的方式实现移动构造函数。专业化不起作用,因为重载决议首选隐式非模板移动构造函数。

\n\n

\xe2\x80\xa0但是,如果参数类型与 不完全匹配const T&,则模板化引用将赢得重载决策。正如 Praveen 的例子所示,这种情况很容易发生。

\n

  • @Praveen 因为 `a1` 不是 `const`。转发参考真是贪心啊。 (5认同)