Когда я использую 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 ]])();
Но нет ли решения, независимого от компилятора?
Попробуй это
typedef void (* FunctionThatNeverReturns)() [[ noreturn ]];
В вашем оригинале спецификатор размещен так, что он применяется к указателю, а не к объекту, на который указывает. Но указатель noreturn вообще не имеет смысла, вы пытаетесь определить указатель на функцию noreturn.
Демо-версия: http://ideone.com/9mBR9x
Эта версия, кажется, компилируется как задумано:
[[noreturn]] void AFunctionThatDoesNotReturn() {}
using FunctionThatNeverReturns = std::add_pointer_t<decltype(AFunctionThatDoesNotReturn)>;
Но компилятор не проходит проверку, мы фактически указываем указатель на невозвратную функцию на указатель: https://ideone.com/YAo73S
Как указано в комментариях, это явно запрещено стандартом.