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指令,
- 和一个返回语句