2016-02-29 90 views
8

当我定义一个constexpr函数时,我是否也应该声明它为noexcept?我想在参数和用法满足编译时评估要求的情况下,潜在例外的含义是没有意义的。但是在运行时对函数进行评估的情况下,它将正常应用。`constexpr`函数也应该是`noexcept`吗?

作为一个实际问题,如果函数确实是简单的,也许使用内置算术或转换,这样我希望编译器总是内联函数并在其中进行优化,对于生成的代码的效率如果我离开noexcept

回答

7

不,你不应该。

“不能失败”和“可在编译时评估”是正交问题。例如,你想写一个整数幂函数,但是你想把它作为签名的权力(因为你认为无符号数只能用于非常特殊的情况)。现在你说如果权力是负面的,你想抛出异常。在C++ 14你可以写这样的:

constexpr int ipow(int base, int power) { 
    if (power < 0) throw std::domain_error("negative power"); 
    int result = 1; 
    for (int i = 0; i < power; ++i) result *= base; 
    return result; 
} 

显然,此功能不可noexcept,但对于非负参数,你明明可以在编译时进行评估。如果您在编译时需要结果的上下文中尝试使用负面参数,则会出现编译错误,这应该很好。

相关问题