C ++ 11 – 在constexpr函数内的static_assert?

如何在constexpr函数中正确地执行static_assert ? 例如:

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

这是无效的C ++ 11代码,因为一个constexpr函数只能包含一个return语句。 我不认为这个标准有一个例外,但是GCC 4.7不允许我编译这个代码。

这是无效的C ++ 11代码,因为一个constexpr函数只能包含一个return语句。

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

你可以抛出,如果x <= 0 。 在需要常量expression式的上下文中调用该函数将无法编译

 constexpr int do_something(int x) { return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0")); } 

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

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

我遇到了与在C ++中使用常量expression式相同的问题。 目前几乎没有关于constexprs的明确文件。 注意,在gcc的问题跟踪器中有一些已知的错误,但是你的问题似乎不是一个错误。

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

编辑:这是允许根据标准:7.1.3状态

…或仅包含复合语句

  • 空语句,
  • static_assert -declarations
  • typedef声明和别名声明不
    定义类或枚举,
  • 使用申述,
  • using指令,
  • 和一个返回语句