首頁  >  問答  >  主體

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

PHPzPHPz2765 天前624

全部回覆(2)我來回復

  • PHP中文网

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

    關於

    static_assert(assert_elementof<int>({ 1,2,3 }, 3), "eee");
    

    由於static_assert的第一個參數必須是一個const表達式,對於constexpr bool assert_elementof(std::initializer_list v, int N),只有當兩個參數都是const的時候,他的回傳值才是const。所以兩個參數{ 1,2,3 }, 3都是常數,所以這段沒有問題。

    關於

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

    去掉那個註解為什麼就不行了,因為N是一個變量,不是一個常數表達式,所以違反static_assert的要求:第一個參數必須是一個const表達式。

    c++ primer裡面有一段摘錄如下:

    constexpr int scale(int N) {return N * 2; }
    
    int main()
    {
        int arr[scale(2)];
        int i = 2;
        int arr2[scale(i)];//这里应该会报错,虽然G++不报错。
        return 0;
    }
    

    不報錯的原因參考這裡

    回覆
    0
  • 阿神

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

    應該沒問題,記得加頭檔

    #include <initializer_list>

    回覆
    0
  • 取消回覆