57

如何在函数static_assert内正确执行 a constexpr?例如:

constexpr int do_something(int x)
{
  static_assert(x > 0, "x must be > 0");
  return x + 5;
}

这不是有效的 C++11 代码,因为 constexpr 函数必须只包含 return 语句。我不认为该标准对此有例外,尽管 GCC 4.7 不允许我编译此代码。

4

2 回答 2

64

这不是有效的 C++11 代码,因为 constexpr 函数必须只包含 return 语句。

这是不正确的。static_assert在一个constexpr函数中很好。不好的是在常量表达式中使用函数参数,就像你做的那样。

你可以抛出 if x <= 0。在需要常量表达式的上下文中调用函数将无法编译

constexpr int do_something(int x) {
  return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0"));
}
于 2011-12-24T19:22:46.367 回答
23

这有效并且是有效的 C++11 代码,因为模板参数仅在编译时:

template <int x>
constexpr int do_something() {
    static_assert(x > 0, "x must be > 0");
    return x + 5;
}

我遇到了与 C++ 中的常量表达式相同的问题。目前几乎没有关于 constexprs 的明确文档。请注意,在 gcc 的问题跟踪器中存在一些已知的错误,但您的问题似乎不是错误。

请注意,如果您在类中声明 constexpr 函数,则无法在类中使用它们。这似乎也不是一个错误。

编辑:根据标准允许这样做:7.1.3 states

...或仅包含的复合语句

  • 空语句,
  • static_assert -声明

  • 定义类或枚举的 typedef 声明和别名声明,
  • 使用声明,
  • 使用指令,
  • 并且只有一个返回语句
于 2012-08-24T12:44:46.277 回答