我有一些类,我希望在编译时由需要某种级别验证的初始化列表初始化。

我首先尝试了 static_assert 但这不会编译错误“静态断言的非常量条件”

导致构建错误的最佳方法是什么?

class foo {
public:
    constexpr foo(std::initializer_list<bar> items) {
        for(auto &&i: items) {
            if(i == 12) // example validation logic
                // fail the build
        }
    }
}

constexpr foo foo_list({0,1,2,3,4,5});// should succeed
constexpr foo foo_list_bad({0,1,12,4,68});// should fail to build

#1楼 票数:1 已采纳

使用在编译时无法使用的构造,例如异常:

constexpr foo(std::initializer_list<bar> items)
{
    for (auto&& i : items) {
        if (i == 12) {
            throw std::invalid_argument{""}; // for example
        }
    }
}

如果异常被禁用,则为假断言:

constexpr foo(std::initializer_list<bar> items)
{
    for (auto&& i : items) {
        assert(i != 12);
    }
}

或者,如果定义了NDEBUG则调用运行时函数:

constexpr foo(std::initializer_list<bar> items)
{
    for (auto&& i : items) {
        if (i == 12) {
            std::cerr << "Error\n";
        }
    }
}

如果仅运行时表达式作为常量表达式求值的一部分求值,则需要诊断。

static_assert不起作用,因为它的参数需要是一个常量表达式,而constexpr函数的参数不是。

  ask by Mitchk translate from so

未解决问题?本站智能推荐:

2回复

std::initializer_list::size()与std::array::size()的constexpr-ness

std::initializer_list和std::array的size()成员函数具有相同的签名: 两者都是constexpr 。 但是,可以在constexpr上下文中使用std::array::size() ,但std::initializer_list::size()不能:
3回复

std::initializer_list和carray[]的优点和缺点是什么?

假设我有一些假设结构: 我可以写 要么 无法使用auto - 编译器必须知道内部类型 。 这两个版本都有任何缺点吗? 更新: 另外值得关注的是,您是否能够使用/将一种类型转换为另一种类型 - 例如。 在构建标准容器时?
2回复

`std::initializer_list上的`static_assert`::size`在函数中

在我的单元测试中,我想要一种快速且(干净的)肮脏的方式来将值从initializer_list分配给静态大小的 C 数组。 我不是一个完整的野兽,所以我想static_assert大小是相同的。 我写了一个辅助函数set_array来做到这一点: 意图将其用作set_array(foo, {1, 2
2回复

如何将字符串列表存储在constexpr上下文中?

我正在为一些域对象类转换这些文档字符串表(作为类型特征,如系统),直到我弄清楚这个问题。 后来,我打算在编译时检查这些特殊成员是否有编写的文档(作为我在编译时希望它的原因)。 我为演示创建了一个小例子: https://godbolt.org/z/3dX3-e 基本上,3个主要编译器
1回复

constexpr数组和std::initializer_list

我试图编写一个可以像这样使用的编译时valarray: 我设法用以下实现来做它并且它工作正常(使用GCC 4.7): 虽然它对我来说很好,但我不确定std::initializer_list的行为,可能会使用一些未定义的行为。 constexpr for std::initializ
1回复

带有std::initializer_list的奇怪行为constexpr

我试图理解为什么编译器在这里抱怨:// cexpr_test.cpp#include <initializer_list>constexpr int test_cexpr(std::initializer_list<const char*> x){ return (in
1回复

在编译时验证std::initializer_list的内容

我试图在编译时确定std::initializer_list中的所有值是否唯一。 我能够找到一种解决方案来改变列表的大小 ,但是无法将其应用于内容。 我尝试使用自由函数和构造函数,但两种方法均导致GCC 4.7.2出现以下错误。 错误:静态声明的非恒定条件 错误:“开始”不是常量表
2回复

为什么不将`std::initializer_list`定义为文字类型?

这是这个问题的后续: 声明 constexpr initializer_list 对象是否合法? . 从 C++14 开始, std::initializer_list类的所有方法都标有constexpr 。 能够通过执行constexpr std::initializer_list<int