为什么不std::decay
从函数指针中删除noexcept指定符?
例如,这符合c ++ 17
#include <type_traits>
template<typename>
struct is_noexcept {};
template<typename R, typename ... Arg>
struct is_noexcept<R(*)(Arg...)> : public std::false_type {};
template<typename R, typename ... Arg>
struct is_noexcept<R(*)(Arg...) noexcept> : public std::true_type {};
void test() noexcept {}
int main(){
void (*b)() noexcept = test;
static_assert(is_noexcept<decltype(b)>::value);
static_assert(is_noexcept<std::decay<decltype(b)>::type>::value);
}
答案 0 :(得分:5)
std::decay
类型转换特征执行将表达式按值传递给函数模板时发生的转换:
template <class T>
void f(T);
int main() {
f(expr); // T is deduced to std::decay_t<decltype(expr)>
}
这样的一种转换是函数到指针的转换,因为不能按值传递函数。出于类型安全的原因,函数到指针的转换保留了函数的noexcept
规范,因此std::decay
也是如此。