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};
}