Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将constexpr initializer_list作为c+中的参数传递+;14_C++_C++11_C++14 - Fatal编程技术网

C++ 将constexpr initializer_list作为c+中的参数传递+;14

C++ 将constexpr initializer_list作为c+中的参数传递+;14,c++,c++11,c++14,C++,C++11,C++14,为什么这不起作用: constexpr initializer_list<int> ilist = {1,2,3,4}; constexpr int my_min = min(ilist); 我的代码基于constexpr std::min()函数,如图所示,并使用clang3.5.0编译(g++4.9.1似乎不知道constexpr std::min() 我无法理解我得到的错误: clang35 -stdlib=libc++ -std=c++14 test.cpp -o tes

为什么这不起作用:

constexpr initializer_list<int> ilist = {1,2,3,4};
constexpr int my_min = min(ilist);
我的代码基于constexpr std::min()函数,如图所示,并使用clang3.5.0编译(g++4.9.1似乎不知道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};
clang35-stdlib=libc++-std=c++14 test.cpp-o test;
test.cpp:158:35:错误:constexpr变量“ilist”必须由常量表达式初始化
constexpr初始值设定项_list ilist={1,2,3,4};
^       ~~~~~~~~~
test.cpp:158:35:注意:指向临时对象的子对象的指针不是常量表达式
test.cpp:158:43:注意:此处创建了临时
constexpr初始值设定项_list ilist={1,2,3,4};
^
test.cpp:159:17:错误:constexpr变量“my_min”必须由常量表达式初始化
constexpr int my_min=min(ilist);
^        ~~~~~~~~~~
test.cpp:159:30:注意:'ilist'的初始值设定项不是一个常量表达式
constexpr int my_min=min(ilist);
^
test.cpp:159:30:注:在调用“初始值设定项列表(ilist)”时
测试cpp:158:35:注:此处声明
constexpr初始值设定项_list ilist={1,2,3,4};

C++14尚未在g++和clang++中完全实现。在您的特定情况下:g++STL没有实现
template constexpr T min(std::initializer\u list ilist)

虽然clang++还没有初始化器列表的constexptr构造函数。

与第二个代码段相比,第一个代码段没有编译的原因是创建底层数组的时间点。[dcl.init.list]/5:

类型为
std::initializer\u list
的对象由 初始值设定项列表,好像实现分配了一个临时数组
N
类型
const
元素的,其中
N
是 初始值设定项列表

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

所有例外都不适用,但请注意第二个示例中适用的最后一点


Clang(毫不奇怪)是正确的,而GCC错误地接受了您的代码。上述裁决也是@dyp代码失败的原因:对
i
执行l-t-r转换不是一个常量表达式。特别是,(2.7.1)不适用,因为临时问题不是
const

您的问题是(由于链接的问题没有答案,所以不投票关闭)。同样相关的是(在dupe的评论中链接)。你是对的,我实际上没有注意到,即使只是定义
constexpr初始值设定项\u list ilist={1,2,3,4}
不会编译,除非它是全局变量。您可以通过将(本地)
ilist
声明为
static
来解决其中一个问题。用于实现RHS的临时数组的生存期将延长到静态存储持续时间,这允许在常量表达式中获取其地址。不过,它并没有解决第二个问题——我不确定这是故意的还是错误;constexpr int j=i也不编译。不过,我不完全明白其中的道理。。它应该用GCC5来完成。问题是
constexpr初始值设定项\u list ilist={1,2,3,4}编译失败-与
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};