gpt4 book ai didi

c++ - 如果在 constexpr 上下文中,如何在 assert() 和 static_assert() 之间分派(dispatch),依赖?

转载 作者:行者123 更新时间:2023-12-01 12:31:30 25 4
gpt4 key购买 nike

在 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论点是不可能的(但会很好)。在这种情况下,编译器给了我一个关于越界访问的不同错误。

最佳答案

就像是

void assert_impl() { assert(false); } // Replace body with own implementation

#ifdef NDEBUG // Replace with own conditional
#define my_assert(condition) ((void)0)
#else
#define my_assert(condition) ((condition) ? (void()) : (assert_impl(), void()))
#endif

template<int Size>
struct Array {
int m_vals[Size];
constexpr const int& getElement( int idx ) const
{
return my_assert(idx < Size), m_vals[idx];
}
};

如果在需要常量表达式的上下文中使用,它将在断言失败时给出编译时错误(因为它将调用非 constexpr 函数)。

否则它将在运行时调用 assert 失败。 (或您的类似物)。

据我所知,这是你能做的最好的。没有办法使用 idx 的值在需要常量表达式的上下文之外强制在编译时进行检查。

逗号运算符语法不好,但是 C++11 constexpr功能非常有限。

当然,正如您已经指出的,如果在需要常量表达式的上下文中使用函数,无论如何都会诊断出未定义的行为。

如果你知道 assert如果条件计算为 true,则(或您的类似物)不会扩展到常量表达式中禁止的任何内容但如果它的计算结果为 false , 那么你可以直接使用它来代替 my_assert并跳过我在代码中构建的间接性。

关于c++ - 如果在 constexpr 上下文中,如何在 assert() 和 static_assert() 之间分派(dispatch),依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59880069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com