移动构造函数不能默认

时间:2014-02-13 21:24:50

标签: 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& 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

我的问题是:

  1. 我做错了哪些不允许类X拥有默认的移动构造函数?
  2. 如果存在一个我们实际上无法默认其移动构造函数的类,我是否可以知道如何开发其移动构造函数?
  3. 谢谢,

3 个答案:

答案 0 :(得分:3)

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

  

GCC的C ++ 11模式实现了由C ++生成的大部分C ++ 11标准   ISO C ++委员会。该标准可从各个国家获得   标准机构;在发布之前的工作文件   标准可在ISO C ++委员会的网站上找到   http://www.open-std.org/jtc1/sc22/wg21/。由于这个标准只有   最近完成了,实验提供的功能集   从一个GCC版本到另一个版本,C ++ 11模式可能差别很大。没有   将尝试保持与C ++ 11的向后兼容性   在C ++ 11过程中语义发生了变化的特性   标准化。

GCC 4.7中也引入了std=c++11标志。来自man gcc(我在info gcc中找不到):

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.

我认为在最新的编译器版本中,标志是相同的,但您应该更喜欢c++11来避免潜在的错误。

info gcc命令:

  

默认情况下,如果没有给出C ++语言方言选项,则为   '-std = GNU ++ 98'。

这意味着c++98有扩展名。

答案 1 :(得分:2)

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

g++: error: unrecognized command line option ‘-std=C++11’

答案 2 :(得分:1)

此代码由GCC 4,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;
};

我没有在标准中找到可以说移动构造函数可能没有默认的位置。