Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 移动构造函数不能为默认值_C++_C++11_Constructor_Move - Fatal编程技术网

C++ 移动构造函数不能为默认值

C++ 移动构造函数不能为默认值,c++,c++11,constructor,move,C++,C++11,Constructor,Move,我是c++11新手,并编写了以下类,希望它支持std::move: class X { public: X(int x) : x_(x) {} ~X() { printf("X(%d) has be released.\n", x_); } X(X&&) = default; X& operator = (X&&) = default; X(const X&) = delete; X& operat

我是c++11新手,并编写了以下类,希望它支持
std::move

class X {
 public:
  X(int x) : x_(x) {}
  ~X() {
    printf("X(%d) has be released.\n", x_);
  }

  X(X&&) = default;
  X& operator = (X&&) = default;

  X(const X&) = delete;
  X& operator = (const X&) = delete;
 private:
  int x_;
};
但是,当我使用选项
-std=c++0x
编译它时,编译器会抱怨如下:

queue_test.cc:12: error: ‘X::X(X&&)’ cannot be defaulted
queue_test.cc:13: error: ‘X& X::operator=(X&&)’ cannot be defaulted
g++: error: unrecognized command line option ‘-std=C++11’
我的问题是:

  • 我是否做错了什么,不允许class
    X
    使用默认的移动构造函数
  • 如果存在一个类,我们真的不能默认它的移动构造函数,我可以知道我应该如何开发它的移动构造函数吗

  • 谢谢,

    如评论所示,错误是由不正确的编译器选项引起的。应使用选项
    -std=c++11
    。(请注意,它是小写而不是大写,否则编译器将抱怨如下):


    此代码由GCC4,8,1编译

    C++的标准还有以下例子

    struct trivial {
    trivial() = default;
    trivial(const trivial&) = default;
    trivial(trivial&&) = default;
    trivial& operator=(const trivial&) = default;
    trivial& operator=(trivial&&) = default;
    ~trivial() = default;
    };
    
    我还没有在标准中找到一个地方可以说move构造函数可能不是默认的。

    来自GCC的C++0x页面:

    GCC的C++11模式实现了 ISO C++委员会。该标准可从多个国家/地区获得 标准机构;发布前的工作文件 标准可在ISO C++委员会网站上找到。 . 由于本标准仅适用于 最近完成的功能集提供了实验 在不同的GCC版本中,C++11模式可能会有很大的不同。不 将尝试保持与C++11的向后兼容性 语义在C++11过程中发生变化的功能 标准化

    GCC4.7中还引入了
    std=c++11
    标志。从
    mangcc
    (我在
    infogcc
    中没有找到它):

    我认为这意味着在最新的编译器版本中,标志是相同的,但是您应该更喜欢
    c++11
    ,以避免潜在的bug

    info gcc
    命令:

    默认,如果没有C++语言选项,则 “-std=gnu++98”


    这意味着带有扩展名的
    c++98

    -std=c++11,这就是你的旧编译器中的所有缺陷。试图用一个非常旧的编译器来学习C++11,它使用
    -std=C++0x
    而不是
    -std=C++11
    ,可能会非常具有挑战性。尝试更新到最近的编译器版本。非常感谢您的评论!下次更多信息,请参见
    info gcc
    。它给出了两种选择之间差异的一个相当彻底的细分。虽然我理解它与编译器版本以及它如何影响标志混淆,但结合gcc C++11版本支持,“代码>信息GCC < /C>和<代码> man GCC < /Calp>是您真正需要的。@ Keelar我使用www. IDENE.com,其中编译器的所有选项都可以编译成C++ 11。
    c++11
    c++0x
                   The 2011 ISO C++ standard plus amendments.  Support for C++11
                   is still experimental, and may change in incompatible ways in
                   future releases. The name c++0x is deprecated.