Visual Studio 2012 __cplusplus e C ++ 11

Alguém sabe por que o __cplusplus é definido como 199711L (que é o “antigo” C ++) no meu projeto c ++ do Visual Studio 2012? Não deveria dizer 201103L desde VS 2012 agora tem suporte para C ++ 11? Mesmo se eu include headers C ++ 11, ele ainda está erroneamente definido. Alguma pista?

Isso já foi enviado para a Microsoft para revisão:

Um valor da macro predefinida __cplusplus ainda é 199711L

Isso realmente depende do que você espera que a macro realmente signifique. 201103L significa “Este compilador suporta totalmente todo o C ++ 11 tanto no compilador quanto na biblioteca?” Deveria significar “Este compilador suporta algum subconjunto razoável de C ++ 11?” Deveria significar “Este compilador suporta pelo menos um recurso C ++ 11 de alguma forma, forma ou formulário?”

Cabe a cada implementação decidir quando aumentar o número da versão. O Visual Studio é diferente do Clang e do GCC, já que não possui um modo de compilation C ++ 03 separado; Ele fornece um conjunto específico de resources, e é isso que ele fornece.

Em geral, uma única macro não é uma ferramenta útil para decidir quando usar algum recurso. O Boost.Config é um mecanismo muito mais confiável. O comitê de padrões está investigando maneiras de lidar com esse problema em futuras versões do padrão.

Eu estou com Nicol nessa. A única razão para testar o __cplusplus >= 201103L é verificar se você pode usar os novos resources. Se um compilador implementar apenas metade dos novos resources, mas usar o novo valor de __cplusplus , ele não conseguirá compilar um código C ++ 11 válido protegido por __cplusplus >= 201103L (eu tenho alguns que usam thread_local e *this references) . Se, por outro lado, ele mantiver 199711L , ele usará o código C ++ 98 seguro, que ainda está bem. Pode perder algumas otimizações dessa forma, mas você ainda pode usar outras maneiras de detectar se um recurso específico está disponível (versão do compilador, macros específicas do compilador como __GXX_EXPERIMENTAL_CXX0X__ , aumentar macros que verificam macros do compilador para você, etc). O que importa é um padrão seguro.

Existem duas razões possíveis para mudar para o novo valor de __cplusplus:

  • seu compilador tem suporte total para o C ++ 11 (ou próximo o suficiente, sempre haverá bugs)
  • Este é um modo experimental do seu compilador que não deve ser usado na produção, e o que normalmente estaria faltando, conta como bugs.

Tanto quanto eu sei, todos os compiladores que mudaram estão na segunda categoria.

Acredito que alguns fornecedores de compiladores estão muito entusiasmados com a mudança do valor do __cplusplus (o recurso C ++ 11 mais fácil de implementar, boa publicidade), e é bom que alguns sejam mais conservadores.

A partir de abril de 2018, o MSVC 2017 agora corrige os relatórios da macro, mas somente se uma opção específica for usada (/ Zc: __ cplusplus). Isso ocorre porque muitos códigos antigos dependem da detecção do valor antigo da macro para compiladores MSVC. Fonte: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/

Espero que, no futuro, quando as pessoas em todo o mundo atualizarem seu código, a MS relatará a macro corretamente por padrão.