GCC 4.8.1是否完全支持C++11?

7

操作系统是Windows。

首先声明,我没有使用过C++或者其他编译型语言。我有一些使用CPython的经验并熟悉它,但直到今天早些时候我才从未浏览过C++源代码。

我正试图自学C++,所以我一直在尝试一些东西,但我遇到的一个问题就是错误:

error: 'to_string' was not declared in this scope

显然,to_string是C++11的东西,这应该没问题。我下载了最新的MinGW,并将其添加到我的路径中 - 我已经检查过了,并运行了

g++ - v

确实告诉我已经安装了版本4.8.1。我正在使用的IDE,Code::Blocks没有问题,但它根本不会使用任何C++11东西,给我像上面那样的错误。与C++11无关的事情编译得很好。

有一个编译器标志下的部分是“遵循C++11语言标准”,我已经检查过了,但即便如此,我仍然会遇到相同的错误。我真的不知道发生了什么 - 我查找了这个问题,所有的建议都是更新IDE或MinGW(两者都是最新的),或选择该标志,正如我所说,它已经被选中了。

是否有更多C ++经验的人有任何想法可能发生了什么?


你设置了-std=c++11吗?另外,https://dev59.com/smcs5IYBdhLWcg3wSSDH - Mark Garcia
@Mark,那不是我提到的编译器标志吗?此外,根据您提供的链接,这已在(当时)更新的版本中得到修复。 - Kevin
@pyCthon - 我已经在ideone上测试了我的代码,没有任何问题。所以这绝对不是命名空间的问题。 - Kevin
@remyabel - 我猜也是这样,但我已经调整了各种设置,还是没有找到解决方法。 - Kevin
1
@Kevin,看起来在mingw的主干版本中已经修复了这个问题:http://sourceforge.net/apps/trac/mingw-w64/wiki/to_string - David Brown
显示剩余7条评论
4个回答

10

我的理解是,除了对regex的支持外,G++ 4.8.1 的 C++11 支持已基本完成。

以下两个链接突出了 G++ 4.8.1 和 libstdc++ 中 C++11 支持的状态:

然而,要编译 C++11 代码,你需要在编译时包含命令行标志-std=c++11


1
核心语言已经完成,但在库中还有很多缺失(Unicode 转换可能是最突出的)。 - Cubbi
@Cubbi :好的,谢谢。我在那里发布了一些链接,涵盖了GCC 4.8.x和libstdc++状态页面,以及C++11。希望这些也有所帮助。 - Joe Z
2
g++ 4.8 系列中的核心语言并不完整。它无法正确处理右值引用。 - David Hammen

2

在核心语言方面,g++ 4.8系列还不够完善。以下代码可以在g++ 4.9及以上版本(以及clang++ 3.3及以上版本)中编译和运行,但无法在g++ 4.8.5(或任何g++ 4.8系列之前的版本)中编译。

#include <iostream>

void ordinary_function (int&)  { std::cout << "ordinary_function(int&)\n"; }   

void ordinary_function (int&&) { std::cout << "ordinary_function(int&&)\n"; }   

template<class T>
void template_function (T&)  { std::cout << "template_function(T&)\n"; }   

template<class T>
void template_function (T&&) { std::cout << "template_function(T&&)\n"; }   

int main () {   
    int i = 42; 
    ordinary_function(42); // Not ambiguous.
    ordinary_function(i);  // Not ambiguous.
    template_function(42); // Not ambiguous.
    template_function(i);  // Ambiguous in g++4.8.
}   

2

0

std::stringstd::list的行为不符合C++11标准。libstdc++文档在这里[https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html]。 一个名为_GLIBCXX_USE_CXX11_ABI的宏可以控制它们在GCC5 /更高版本中的行为。

除此之外,GCC-4.8中的C++11 std::function与GCC-5及更高版本不同,并且没有宏可以控制std::function的行为。 [GCC-4和GCC-5/6/7/8/9之间未记录的std::function ABI更改,如何使.so与devtoolset-4/6/7/8/9一起工作?]

GCC-4.8中的C++11被认为是实验性支持,因此不要过度依赖它。


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