如何在static_assert
函数中正确执行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不允许我编译此代码。
答案 0 :(得分:59)
这不是有效的C ++ 11代码,因为constexpr函数只能包含return语句。
这是不正确的。 static_assert
函数中的constexpr
没问题。什么是不罚款是在常量表达式中使用函数参数,就像你这样做。
你可以抛出x <= 0
。在需要常量表达式的上下文中调用函数将无法编译
constexpr int do_something(int x) {
return x > 0 ? (x + 5) : (throw std::logic_error("x must be > 0"));
}
答案 1 :(得分: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状态
...或仅包含
的复合语句