[[noreturn]] указатель на функцию

Когда я использую Clang (version 3.4 (trunk 194574)) чтобы скомпилировать это:

typedef void (* FunctionThatNeverReturns [[ noreturn ]])();

Я получаю это:

error: 'noreturn' attribute only applies to functions and methods

Это удивляет меня, потому что он работал отлично с более старой версией Clang.

Итак, как я могу определить указатель на [[ noreturn ]] функционировать?

Мне это нужно, потому что я вызываю указатель на функцию внутри [[ noreturn ]] функция, которая, очевидно, выдает предупреждение, если указатель функции не помечен как noreturn.

Ох, и это работает:

typedef void (* FunctionThatNeverReturns [[ gnu::noreturn ]])();

Но нет ли решения, независимого от компилятора?

7

Решение

Попробуй это

typedef void (* FunctionThatNeverReturns)() [[ noreturn ]];

В вашем оригинале спецификатор размещен так, что он применяется к указателю, а не к объекту, на который указывает. Но указатель noreturn вообще не имеет смысла, вы пытаетесь определить указатель на функцию noreturn.

Демо-версия: http://ideone.com/9mBR9x

0

Другие решения

Эта версия, кажется, компилируется как задумано:

[[noreturn]] void AFunctionThatDoesNotReturn() {}
using FunctionThatNeverReturns = std::add_pointer_t<decltype(AFunctionThatDoesNotReturn)>;

Но компилятор не проходит проверку, мы фактически указываем указатель на невозвратную функцию на указатель: https://ideone.com/YAo73S

0

Как указано в комментариях, это явно запрещено стандартом.

0
По вопросам рекламы [email protected]