我正在用这个简单的例子测试std :: move
但是当我尝试编译此代码时,会发生错误
#include <utility> // std::move
#include <iostream> // std::cout
#include <vector> // std::vector
#include <string> // std::string
int main () {
std::string foo = "foo-string";
std::string bar = "bar-string";
std::vector<std::string> myvector;
myvector.push_back (foo); // copies
myvector.push_back (std::move(bar)); // moves
std::cout << "myvector contains:";
for (std::string& x:myvector) std::cout << ' ' << x;
std::cout << '\n';
return 0;
}
但eclipse中的控制台窗口似乎表示编译成功如下
所以我尝试使用console命令编译而不是eclipse来检查什么是正确的
g++ -D__GXX_EXPERIMENTAL_CXX0X__ -std=c++11 test.cpp
这是成功和有效的。
eclipse有什么问题?
我正在使用eclipse版本3.8
答案 0 :(得分:8)
您从Eclipse CDT的代码分析中获得错误,而不是来自编译器。代码分析可能很有用,但设置起来很复杂,并且因为它涉及Eclipse执行自己的(有限的)C ++解析,所以它并不总是与真正的编译器一致。 (“类型”列中的“语义错误”是一个赠品,它是代码分析错误。实际编译器错误列为“C / C ++错误”。)
代码分析错误是无害的 - 如您所见,它们不会影响编译。为了使代码分析工作,Eclipse执行“发现” - 它调用GCC本身并解析输出以确定预处理器定义,包含路径等内容。当Eclipse发现时,Eclipse很可能不启用C ++ 11 。修复它在某种程度上取决于您的系统和Eclipse版本;这是我如何解决它:
-std=c++11
添加到“命令的末尾以获取编译器规范。”在最新的Eclipse中,如果您让Eclipse管理您的C ++设置而不是编写自己的makefile,那么就像@user3159253 says一样,您可以使用toolchain support而不是手动编辑编译器设置。 / p>
以下是其他一些尝试。
答案 1 :(得分:3)
我猜Eclipse调用gcc
并没有收到-std=c++11
参数。如果您有现代CDT,请查看此页面:http://wiki.eclipse.org/CDT/User/NewIn83#Toolchains如果没有,请按照@JoshKelley的建议进行操作