我是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
我的问题是:
X
拥有默认的移动构造函数?谢谢,
答案 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;
};
我没有在标准中找到可以说移动构造函数可能没有默认的位置。