【发布时间】:2020-05-09 19:32:40
【问题描述】:
在 C++11 constexpr 函数中,第二条语句(例如 assert())是不可能的。 static_assert() 很好,但如果该函数被称为“普通”函数,它将不起作用。逗号运算符可以来帮助 wrto。 assert(),但很丑陋,一些工具会发出警告。
考虑这样的“getter”,它在断言旁边是完全可解释的。但我想为运行时和编译时保留某种断言,但不能仅仅根据“constexpr”上下文重载。
template<int Size>
struct Array {
int m_vals[Size];
constexpr const int& getElement( int idx ) const
{
ASSERT( idx < Size ); // a no-go for constexpr funcs in c++11
// not possible, even in constexpr calls as being pointed out, but what I would like:
static_assert( idx < Size, "out-of-bounds" );
return m_vals[idx];
}
};
附带条件:C++11、无堆、无异常、无编译器细节。
注意正如评论者指出的(谢谢!),static_assert 的论点是不可能的(但会很好)。在这种情况下,编译器给了我一个关于越界访问的不同错误。
【问题讨论】:
-
"但很丑" 嗯,逗号操作符可能很丑,但它在 C++11 中可以胜任。花哨的解决方案是切换到 C++14。 :)
-
"一些工具会发出警告" 哪些工具和哪些警告?
-
逗号运算符曾经是我的解决方案,但是 a) 被 qacpp(编码指南)等静态代码分析警告,b) 在下游项目中导致奇怪的语法错误(没有理解,怀疑自定义断言宏)。好吧,我现在只是尽量避免它,但我同意它确实起到了作用。
-
@Borph 不,您根本不能使用依赖于
idx的static_assert。如果函数用于需要常量表达式的上下文中,则只能通过强制评估使其不是常量表达式的构造来诊断idx的错误值。在这样的上下文之外,您永远无法在编译时检查该值。
标签: c++ c++11 assert constexpr static-assert