使用带有constexpr函数的noexcept

时间:2017-10-17 17:41:25

标签: c++

Scott Meyers' "有效的现代C ++",他提供了以下函数来查找数组的大小:

template<typename T, std::size_t N>
constexpr std::size_t arraySize(T (&)[N]) noexcept
{
    return N;
}

&#39; noexcept&#39;的目的是什么?这里?据我了解,noexcept仅影响运行时代码的生成 - 但是我无法看到在运行时调用此函数而不是编译时间的任何情况?

2 个答案:

答案 0 :(得分:5)

在一般情况下,标记为constexpr的模板在实例化时可能会丢失该状态。如果一组特定的模板参数不允许,那么静默删除该限定条件,并且生成的函数是“常规”函数。

最有可能指明这样做,教你一个好习惯。虽然确实将consexpr函数隐式假设为非抛出,但如果删除了函数的constexpr状态,它仍然不会干扰正确的noexcept规范。当它被用作表达式的一部分时被送到noexcept()运算符。

如果没有这样定义,它会偏倚在noexcept()的应用程序中使用它的函数的异常规范。因为它被认为可能在没有规范的情况下投掷。

由于noexcept()运算符也是在编译时进行评估的,因此根本不是代码生成(就像你所说的那样)。这更像是语义正确性的问题,类似于const正确性。

答案 1 :(得分:0)

  

但是我无法看到在运行时调用此函数而不是编译时间的任何情况?

例如,只需使用:

int a[42];

std::cout << arraySize(a);

我们不是一个持续的表达。

要强制使用constexpr,您必须使用以下内容:

int a[42];
constexpr auto size = arraySize(a);
std::cout << size;