![](/img/trans.png)
[英]What is expected lifetime of std::intializer_list object in C++14?
[英]pass constexpr intializer_list as argument in 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()函数,如在这里和我使用clang3.5.0编译器(G ++ 4.9.1似乎没有意识到一个constexpr的std ::分钟())。
我无法理解我得到的错误:
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};
您的第一个代码段不能编译而不是第二个代码段的原因是创建基础数组的时间点。 [dcl.init.list] / 5:
类型为
std::initializer_list<E>
的对象是从初始化列表构造的,就好像该实现分配了一个类型为const E
的N
元素的 临时数组 ,其中N
是初始化列表中的元素数。
现在,当调用min
,我们访问该数组的元素。 但是,[expr.const] / 7是不可侵犯的:
没有例外情况适用,但请注意适用于第二个示例的最后一个要点。
Clang(不出所料)是正确的,而GCC虚假地接受了你的代码。 上面的裁决也是@ dyp的代码失败的原因:在i
上执行ltr转换不是一个常量表达式。 特别是,(2.7.1)不适用,因为临时不是const
。
C ++ 14还没有完全实现,既没有g ++也没有clang ++。 在您的特定情况下:g ++ STL没有实现template constexpr T min(std::initializer_list ilist);
虽然clang ++还没有初始化器列表的constexptr构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.