C++ 移动构造函数不能为默认值
我是c++11新手,并编写了以下类,希望它支持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
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’
我的问题是:
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.