如何让g++编译具有移动构造函数的C++11代码?

22

我似乎无法让g++编译使用移动构造函数的C++11代码。我一直收到这个错误:

collin@Serenity:~/Projects/arraylib$ g++ ./t2.cpp
./t2.cpp:10:27: error: expected ‘,’ or ‘...’ before ‘&&’ token
./t2.cpp:10:38: error: invalid constructor; you probably meant ‘Blarg (const Blarg&)’

我正在编写的程序与此非常不同,但我将其缩减为似乎应该绝对有效的部分,然而仍会触发错误:

#include <iostream>

using namespace std;

class Blarg {
    public:
        Blarg () {};
        Blarg (const Blarg& original) {}; /* Copy constructor */
        Blarg (Blarg&& original) {}; /* Move constructor */
};

int main(int argc, char *argv[])
{
    Blarg b;
    return 0;
}

有谁能告诉我我做错了什么?或者如何修复它?

这是我的gcc版本:

gcc (Ubuntu/Linaro 4.6.2-14ubuntu2) 4.6.2

2
请注意,为移动构造函数传递const引用是相当无用的;实际上应该是Blarg(Blarg&& original) - ildjarn
好的,谢谢。我已经在我的实际代码中修复了这个问题。我也会在上面进行修改。 - Talia
2个回答

41

执行 g++ -std=c++0x ./t2.cpp 命令。

同时,您最好做得对并启用所有警告:

g++ -W -Wall -Wextra -pedantic -std=c++0x -o t2 t2.cpp

你真的,真的不应该使用更少的编译选项,尤其是如果你打算在SO上问有关代码的问题 :-) 对于发布版本,应该考虑选择各种优化标志,例如 -s -O2 -flto -march=native


2
“做正确的事”,虽然-std=c++0x的人页声明“此选项启用可能在未来被删除的实验功能”,但他们在那些人页中确实很有防御性 :-) - Captain Giraffe
非常感谢你帮我省去翻阅600多页的手册的麻烦…我只需要再确认一下这个是否按照我的意图运行,然后把它标为答案。 - Talia
2
@CaptainGiraffe:确保方言选项不包含在“做正确”的范畴之下。话虽如此,c++0x将会被支持一段时间,但从4.7版本开始,你也可以使用c++11 - Kerrek SB
哦,迫不及待地想要把那个开关投入使用。今年圣诞礼物提前到了=) - Captain Giraffe
不幸的是,即使使用-Wall -Wextra -Werror也不能启用所有警告(请参见https://dev59.com/CFPTa4cB1Zd3GeqPiE4F和https://dev59.com/tHRC5IYBdhLWcg3wJNcN) - Philipp
@Philipp 这是幸运的,而不是不幸的。 举个极端的例子:您真的想要为程序中任何地方声明的每个变量都发出警告吗,即使是编译器隐式生成的变量? (-Wlarger-than=1)举个不那么极端的例子:当您已经在命令行上指定 -std=c++11 以启用新的 C++11 语言特性(例如 long long)时,您真的想要收到警告吗? (-Wlong-long - user743382

15

您可能忘记在命令行中添加 -std=c++0x


可怜的事情,同样的回答时间,提供了同样好的相关答案,但没有那么多赞。我认为你的回答更简洁、更相关! - Fantastic Mr Fox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接