Обнаружение концепции TS с помощью GCC 6.1

Как определить наличие TS Concepts с помощью GCC 6.1?

На этой странице предлагается предопределить макрос __cpp_experimental_concepts в реализации, поддерживающей концепцию TS. . Однако следующая тестовая программа компилируется без ошибок на GCC 6.1 с флагом -fconcepts:

#ifdef __cpp_experimental_concepts
static_assert(false, "Concepts TS found");
#endif

template <typename T>
concept bool Identity = true;

int main() {}

(Я ожидаю, что либо static_assert сработает, либо ключевое слово concept останется нераспознанным.)

Кто-нибудь знает какой-либо другой метод условной компиляции кода на основе доступности концепций?


person Tristan Brindle    schedule 20.07.2016    source источник
comment
Вы можете найти макрос с echo | g++ -E -dM -fconcepts -x c++ - | fgrep concepts   -  person Jonathan Wakely    schedule 20.07.2016


Ответы (1)


Правильный макрос __cpp_concepts для GCC:

#ifdef __cpp_concepts
static_assert(false, "Concepts TS found");
#endif

Согласно этому, имя макроса было изменено в последнем черновике.

Правильное название взято с страницы поддержки GCC (спасибо Джонатан Уэйкли), но связанный черновик (2015-02-09) по-прежнему требует __cpp_experimental_concepts (что странно... ). Однако в этом последнем проекте (2015-09-25), имя фактически было изменено на __cpp_concepts.

person Holt    schedule 20.07.2016
comment
Странно, что это больше не считается экспериментальным, учитывая, что это все еще TS, но это именно то, что мне было нужно - большое спасибо за быстрый ответ. - person Tristan Brindle; 20.07.2016
comment
Макрос и его официальное значение задокументированы по адресу gcc.gnu.org/projects/cxx. -status.html#tses (похоже, g++ пока устанавливает для него значение 201500, а не 201507) - person Jonathan Wakely; 20.07.2016
comment
@JonathanWakely Похоже, здесь есть несоответствие, поскольку это значение взято из старого черновика, где все еще использовалось __cpp_experimental_concepts. - person Holt; 20.07.2016