c++ - VS2015中,{1,2,3}能转换成constexpr std::initializer_list<int>吗?
PHPz
PHPz 2017-04-17 15:07:16
0
2
651

我看到vs2015中的std::initializer_list已经声明成constexpr了。
那么

template<class T>
constexpr bool assert_elementof(std::initializer_list<T> v, int N)
{
    //static_assert(N == v.size(),"xxx");
    return N == v.size();
}

int main()
{
    constexpr int v[] = { 1,2,3 };
    static_assert(assert_elementof<int>(std::initializer_list<int>(v, v + sizeof(v) / sizeof(v[0])), 3), "eee");
    //static_assert(assert_elementof<int>({ 1,2,3 }, 3), "eee");
    return 0;
}

我的是问题,为什么上面两处注释掉的代码不能在VS2015下编译通过?是我的代码有问题呢,还是VS2015的问题。

PHPz
PHPz

学习是最好的投资!

全員に返信(2)
Ty80

概要

リーリー

static_assert の最初のパラメータは const 式でなければならないため、constexpr boolassert_elementof(std::initializer_list<T> v, int N) の場合、戻り値は両方のパラメータが const の場合のみです。したがって、2 つのパラメータ {1,2,3}、3 は定数であるため、この段落では問題ありません。

概要

リーリー

そのコメントを削除すると機能しないのはなぜですか? N は定数式ではなく変数であるため、static_assert の要件に違反します。つまり、最初のパラメーターは const 式でなければなりません。

C++ 入門書からの抜粋は次のとおりです。

リーリー

エラーが報告されない理由はこちらを参照

いいねを押す +0
阿神

問題ありません。ヘッダー ファイルを忘れずに追加してください

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート