不,不被衰减去除

时间:2018-07-16 14:30:30

标签: c++ c++17

为什么不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);
}

1 个答案:

答案 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也是如此。