如何在函数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 不允许我编译此代码。
如何在函数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 不允许我编译此代码。
这不是有效的 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"));
}
这有效并且是有效的 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
...或仅包含的复合语句