将constexpr intializer_list作为参数传递给c ++ 14

时间:2015-01-07 20:04:07

标签: c++ c++11 c++14

为什么这不起作用:

constexpr initializer_list<int> ilist = {1,2,3,4};
constexpr int my_min = min(ilist);

虽然这样做:

constexpr int my_min = min({1,2,3,4});

我的代码基于constexpr std :: min()函数,如here所示,我使用clang3.5.0编译器(g ++ 4.9.1不会&#39 ; t似乎意识到constexpr std :: min())。

我无法理解我得到的错误:

clang35 -stdlib=libc++ -std=c++14 test.cpp  -o test;
test.cpp:158:35: error: constexpr variable 'ilist' must be initialized by a constant expression
  constexpr initializer_list<int> ilist = {1,2,3,4};
                                  ^       ~~~~~~~~~
test.cpp:158:35: note: pointer to subobject of temporary is not a constant expression
test.cpp:158:43: note: temporary created here
  constexpr initializer_list<int> ilist = {1,2,3,4};
                                          ^
test.cpp:159:17: error: constexpr variable 'my_min' must be initialized by a constant expression
  constexpr int my_min = min(ilist);
                ^        ~~~~~~~~~~
test.cpp:159:30: note: initializer of 'ilist' is not a constant expression
  constexpr int my_min = min(ilist);
                             ^
test.cpp:159:30: note: in call to 'initializer_list(ilist)'
test.cpp:158:35: note: declared here
  constexpr initializer_list<int> ilist = {1,2,3,4};

2 个答案:

答案 0 :(得分:2)

您的第一个代码段不会编译而不是第二个代码段的原因是创建基础数组的时间点。 [dcl.init.list] / 5:

  

std::initializer_list<E>类型的对象是由一个构造的   初始化列表,好像实现分配了一个临时数组   属于N const E个元素,其中N是元素的数量   初始化列表。

现在,在调用min时,我们访问该数组的元素。但是,[expr.const] / 7是不可侵犯的:

enter image description here

没有例外适用,但请注意第二个示例中适用的最后一个要点。

Clang(不出所料)是正确的,而GCC虚假地接受了你的代码。上述裁决也是@ dyp代码失败的原因:在i上执行l-t-r转换不是一个常量表达式。特别是,(2.7.1)不适用,因为暂时不是const

答案 1 :(得分:-2)

C ++ 14在g ++和clang ++中都没有完整实现。在您的特定情况下:g ++ STL没有实现template constexpr T min(std::initializer_list ilist); 虽然clang ++还没有初始化器列表的constexptr构造函数。