찾다

 >  Q&A  >  본문

c++ - VS2015中,{1,2,3}能转换成constexpr std::initializer_list<int>吗?

我看到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的问题。

PHPzPHPz2814일 전649

모든 응답(2)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-17 15:09:16

    소개

    으아악

    static_assert의 첫 번째 매개변수는 const 표현식이어야 하므로 constexpr bool Assert_elementof(std::initializer_listv, int N)의 경우 두 매개변수가 모두 const인 경우에만 반환 값이 됩니다. 따라서 두 매개변수 {1,2,3}, 3은 상수이므로 이 단락에서는 문제가 없습니다.

    소개

    으아악

    해당 주석을 제거하면 왜 작동하지 않나요? N은 상수 표현식이 아닌 변수이므로 static_assert의 요구 사항을 위반합니다. 첫 번째 매개 변수는 const 표현식이어야 합니다.

    다음은 C 입문서에서 발췌한 내용입니다.

    으아악

    오류가 보고되지 않는 이유는 여기를 참고하세요

    회신하다
    0
  • 阿神

    阿神2017-04-17 15:09:16

    괜찮습니다. 헤더 파일을 추가하는 것을 잊지 마세요

    으아악

    회신하다
    0
  • 취소회신하다