为什么这不起作用:
constexpr initializer_list<int> ilist = {1,2,3,4};
constexpr int my_min = min(ilist);
Run Code Online (Sandbox Code Playgroud)
虽然这样做:
constexpr int my_min = min({1,2,3,4});
Run Code Online (Sandbox Code Playgroud)
我在我的基础上的代码的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};
Run Code Online (Sandbox Code Playgroud)
第一个代码片段与第二个代码片段不同,无法编译的原因是创建底层数组的时间点。[dcl.init.list]/5:
类型的对象
std::initializer_list<E>是从初始值设定项列表构造的,就好像实现分配了类型 的元素的临时数组 ,其中是初始值设定项列表中的元素数量。Nconst EN
现在,当调用 时min,我们访问该数组的元素。然而,[expr.const]/7 是不可侵犯的:
没有任何例外情况适用,但请注意适用于第二个示例的最后一个要点。
Clang(毫不奇怪)是正确的,而 GCC 虚假地接受您的代码。上述裁决也是 @dyp 代码失败的原因:对i不是常量表达式执行 ltr 转换。特别是,(2.7.1) 不适用,因为临时值不是const。