Is Gcc 4.8.1 C++11 Complete?

OS is windows.

I'll start off by saying that I have no experience with C++, or any other compiled language. I've used CPython a bit and am familiar with that, but, until earlier today, I'd never even glanced at C++ source.

I'm trying to teach myself C++, so I've been playing around with it a bit, and one problem I'm having is the error:

error: 'to_string' was not declared in this scope

Apparently, to_string is a C++11 thing, which should be fine. I downloaded the latest MinGW, added it to my path - I have checked, and running

g++ - v

does indeed tell me that I have version 4.8.1 installed. The IDE I'm working with, Code::Blocks finds it no problem, but it simply won't use any of the C++11 stuff, giving me errors such as the one above. Things not exclusive to C++11 compile fine.

There is a section under compiler flags to "follow the C++11 language standard", which I have checked, but, even then, I get the same errors. I'm really not sure what's going on - I've looked this up, and all of the suggestions are to update either the IDE or MinGW (both of which are up to date), or to select that flag, which, as I said, is already selected.

Does anyone with more experience with C++ have any idea what might be going on?b

12

4 Answers

My understanding is that, other than regex support, G++'s C++11 support is largely complete with 4.8.1.

The following two links highlight the status of C++11 support in G++ 4.8.1 and libstdc++:

To compile C++11 code, though, you need to include the command line flag -std=c++11 when you compile.

3

The g++ 4.8 series was not complete with regard to the core language. The following compiles and runs with g++ 4.9 and higher (and also with clang++ 3.3 and higher), but not with g++ 4.8.5 (or with any previous member of the g++ 4.8 series).

#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.
}   

std::string is not compliant; it still uses legacy (and buggy especially with threads) 'copy on write' behavior. You might be able to use __gnu_cxx::__vstring as a workaround.

"Class template basic_string Partial Non-conforming Copy-On-Write implementation"

Related: Does g++ meets std::string C++11 requirements

The behavior of std::string and std::list is not conforming C++11 standard. The document of libstdc++ is here [ ] A macro named _GLIBCXX_USE_CXX11_ABI can control the behavior of them in GCC5/higher.

Besides that, C++11 std::function in GCC-4.8 is different from GCC-5 and higher version, and there is no macro can control the behavior of std::function. [ Undocumented ABI changes of std::function between GCC-4 and GCC-5/6/7/8/9, how to make a .so working with devtoolset-4/6/7/8/9? ]

The C++11 in GCC-4.8 is considered as experimental support, so do not depend on it much.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Alexander Ross

Alexander Ross

Gaming, Esports & Interactive Media Writer

Alexander Ross has covered the video game industry for a decade, writing deep dives on game design, esports tournaments, VR developments, and gaming culture.

Share this article
Twitter Facebook Pinterest