Ответ 1
Bjarne С++ 0x FAQ говорит:
__cplusplus
В С++ 0x макрос
__cplusplus
будет установлен в значение, которое отличается от (больше) текущего199711L
.
Есть ли официальный или неофициальный номер #defines, когда компилятор совместим с Cpp0x? Еще лучше, для конкретной функциональности Cpp0x (~ # cpp0xlambda, # cpp0xrvalue и т.д.)?
(ничего не найдено об этом в сети)
Bjarne С++ 0x FAQ говорит:
__cplusplus
В С++ 0x макрос
__cplusplus
будет установлен в значение, которое отличается от (больше) текущего199711L
.
Для С++ 03 согласно 16.8/1 (заданные имена макросов):
Имя
__cplusplus
определяется значением 199711L при компиляции единицы перевода С++.
Для С++ 0x черновик n2857 в соответствии с 16.8/1 (заданные имена макросов):
При компиляции единицы перевода С++ имя
__cplusplus
определяется значением [tbd].
Официальная спецификация включает значение для макроса препроцессора __cplusplus
, но, как указывали другие, это говорит о том, что все в спецификации реализовано. Более того, никакой текущий компилятор (который я знаю) не устанавливает соответствующее значение. Спектры хорошо и хорошо, но полностью нереализованные биты любой спецификации следует считать предварительными; пересечение спецификации и широкой поддержки является реальным "стандартом".
Связанный вопрос: "Как я могу определить, включена ли хотя бы поддержка С++ 0x?", например. с помощью переключателя компилятора -std=c++0x
. Ответ на этот вопрос является специфичным для компилятора и может быть изменен, но оба GCC 4.6 и Clang 2.1 устанавливают макрос препроцессора __GXX_EXPERIMENTAL_CXX0X__
(и дают ему значение 1
), когда включена их частичная поддержка С++ 0x.