簡體   English   中英

在 constexpr 上下文中驗證 std::initializer_list

[英]Validation of an std::initializer_list in constexpr context

我有一些類,我希望在編譯時由需要某種級別驗證的初始化列表初始化。

我首先嘗試了 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

使用在編譯時無法使用的構造,例如異常:

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函數的參數不是。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM