Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.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++ 为什么={}初始化不';你不为tuple工作吗?_C++_C++11_Tuples_Initializer List_List Initialization - Fatal编程技术网

C++ 为什么={}初始化不';你不为tuple工作吗?

C++ 为什么={}初始化不';你不为tuple工作吗?,c++,c++11,tuples,initializer-list,list-initialization,C++,C++11,Tuples,Initializer List,List Initialization,对我来说,对只是元组的特例,但以下几点让我感到惊讶: pair<int, int> p1(1, 2); // ok tuple<int, int> t1(1, 2); // ok pair<int, int> p2={1, 2}; // ok tuple<int, int> t2={1, 2}; // compile error 您试图调用的是显式的,所以。对应的代码不是显式的 将代码更改为 tuple<int, int>

对我来说,
只是
元组
的特例,但以下几点让我感到惊讶:

pair<int, int> p1(1, 2);   // ok
tuple<int, int> t1(1, 2);  // ok

pair<int, int> p2={1, 2};  // ok
tuple<int, int> t2={1, 2}; // compile error
您试图调用的是显式的,所以。对应的代码不是显式的

将代码更改为

tuple<int, int> t2{1, 2};
元组t2{1,2};
它将被编译。

除此之外(我投了更高的票),我想再添加一点信息

C++14之后,标准已更改为允许:

tuple<int, int> t2={1, 2}; 
tuple t2={1,2};
编译并具有预期的语义。这样做的建议是。这也将允许构造,例如:

tuple<int, int>
foo()
{
    return {1, 2};
}
元组
foo()
{
返回{1,2};
}
仅当
tuple
中的所有
T
都可以从所有参数隐式构造时,它才允许执行此操作


作为一个不一致的扩展,libc++已经实现了这个行为。

您应该能够执行
autot2=tuple{1,2}如果需要复制初始化语法。关于这个错误,错误消息说明了一切。
tuple
使用显式构造函数有什么原因吗?@Deqing如果没有,那么包含单个类型的
tuple
可以从可转换为该类型的值隐式构造。@Praetorian为了避免这种情况,也许元组可以有显式构造函数使用一个参数,非显式构造函数使用两个或更多参数?@MattMcNabb请看Howard的答案,看起来这是以不同的方式修复的。你说“不一致”:这个扩展是否改变了C++14下正确的任何代码的行为?@MattMcNabb:是的<代码>可转换{}
在C++14中为false,在C++1z中为true。C++自省的力量已经变得如此强大,以至于几乎不可能在这些天里编写一致的扩展。
tuple<int, int>
foo()
{
    return {1, 2};
}