Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ `constexpr`函数是否也应该是`noexcept`?_C++_C++11 - Fatal编程技术网

C++ `constexpr`函数是否也应该是`noexcept`?

C++ `constexpr`函数是否也应该是`noexcept`?,c++,c++11,C++,C++11,当我定义constexpr函数时,我是否也应该将其声明为noexcept?我认为,在参数和用法满足编译时评估要求的情况下,潜在异常的意义是没有意义的。但在运行时对函数求值的情况下,它将正常应用 出于实际考虑,如果函数确实很简单,可能使用内置的算术或强制转换,因此我希望编译器能够始终内联函数并在函数之间进行优化,那么如果我不使用noexcept?不,您不应该这样做 “不能失败”和“可以在编译时进行评估”是正交问题。例如,您想要编写一个整数幂函数,但您想要将幂作为有符号(因为您认为无符号数只应用于非

当我定义
constexpr
函数时,我是否也应该将其声明为
noexcept
?我认为,在参数和用法满足编译时评估要求的情况下,潜在异常的意义是没有意义的。但在运行时对函数求值的情况下,它将正常应用

出于实际考虑,如果函数确实很简单,可能使用内置的算术或强制转换,因此我希望编译器能够始终内联函数并在函数之间进行优化,那么如果我不使用
noexcept

不,您不应该这样做

“不能失败”和“可以在编译时进行评估”是正交问题。例如,您想要编写一个整数幂函数,但您想要将幂作为有符号(因为您认为无符号数只应用于非常特殊的情况)。现在你说如果幂为负,你想抛出一个异常。在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;
}
constexpr int-ipow(int-base,int-power){
如果(功率<0)抛出std::domain_错误(“负功率”);
int结果=1;
对于(int i=0;i
这个函数显然不是例外,但对于非负参数,显然可以在编译时对其求值。如果在编译时需要结果的上下文中尝试使用它作为负参数,则会得到一个编译错误,这应该可以