C++ 不会通过取消注释移动运算符来编译

标签 c++ templates c++11 copy-constructor move-constructor

我有以下代码:

template <typename T>
struct X {
    X() : x(5) {}

    template <template <typename> class S>
    X(const S<T> & y) : x(y.x) {}

    // Uncomment and it does not compile anymore
    // X(X&& z) : x(z.x) {}

    T x;
};

int main ()
{
    X<int> y;
    auto x = y;
    return 0;
}

您能解释一下为什么在取消注释指定代码后它无法编译吗?

最佳答案

复制构造函数被隐式声明为已删除,因为您声明了一个移动构造函数。

添加一个默认的(或用户定义的)复制构造函数,它可以正常编译:

X(const X<T>&)=default;

关于C++ 不会通过取消注释移动运算符来编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38414851/

相关文章:

接口(interface)声明中的 C++ 实现代码

c++ - 在 C++ 中使用函数模板作为模板模板参数

c++ - 是否可以根据模板参数的常量性有条件地启用模板类的非 const/const 数据成员?

c++ - 如何让我的嵌套类进入模板化类以接受自身的其他版本?

c++ - 模板参数阴影与 friend ?

c++ - 如何制作正则表达式。什么都吃?

c++ - 为什么使用具有特殊含义的覆盖和最终标识符而不是保留关键字?

c++ - OpenMP for 循环和指针

c++ - 如何通过 QFileSystemModel 获取选定文件的*完整*文件路径?

c++ - 有没有比迭代更好的方法在 C++ 中执行 URL 模式匹配?