Это неправильно сформировано в С++ 14 и более ранних версиях:
using fp2_type = void(*)() noexcept;
из-за N4140 [кроме спецификации]/2:
Спецификация-исключения не должна появляться в объявлении typedef или объявлении-алиаса.
Итак, я собираюсь предположить, что вопрос касается C++1z, где спецификация исключений является частью системы типов.
[conv.fctptr]/1:
Значение prvalue типа «указатель на функцию noexcept
» может быть преобразовано в значение prvalue типа «указатель на функцию». Результатом является указатель на функцию.
Таким образом, void (*)() noexcept
может быть (неявно) преобразовано в void (*)()
.
[expr.static.cast]/7:
Инверсия любой стандартной последовательности преобразования (пункт [conv]), не содержащей [(другие случаи опущены)] преобразования указателя на функцию ([conv.fctptr]), может быть выполнена явно с помощью static_cast
.
Ничто другое в [expr.static.cast] также не позволяет преобразовать void (*)()
в void (*)() noexcept
, поэтому это преобразование не может быть выполнено static_cast
.
[expr.reinterpret.cast]/6:
Указатель функции может быть явно преобразован в указатель функции другого типа. Эффект вызова функции через указатель на тип функции ([dcl.fct]), который не совпадает с типом, используемым в определении функции, не определен. За исключением того, что преобразование prvalue типа «указатель на T1
» в тип «указатель на T2
» (где T1
и T2
являются типами функций) и обратно к его исходному типу дает исходное значение указателя, результат такого преобразования указателя не указан. . [Примечание: см. также [conv.ptr] для более подробной информации о преобразовании указателя. — примечание в конце]
Таким образом, reinterpret_cast
может выполнить это преобразование.
Поскольку fp2_type(fp)
эквивалентно приведению (fp2_type) fp
в стиле C ([expr.type.conv]/ 1), и поскольку приведения в стиле C выполняют reinterpret_cast
, когда static_cast
не возможно (для простоты игнорируя const_cast
, так как здесь это не имеет значения), fp2_type(fp)
— это правильно сформированное reinterpret_cast
. Однако результат такого приведения нельзя использовать, кроме как отбросить обратно.
person
T.C.
schedule
22.02.2016
fp2_type(fp)
похоже, что это должно бытьreinterpret_cast
. - person T.C.   schedule 22.02.2016