这实际上是模棱两可的吗
Is This Actually Ambiguous?
所以我知道代码中的大括号不仅仅意味着initializer_list
:如果不是initializer_List,什么是卷曲大括号封闭列表?
但是他们默认为什么?
例如,假设我定义了一个重载函数:
void foo(const initializer_list<int>& row_vector) { cout << size(row_vector) << "x1 - FIRSTn"; }
void foo(const initializer_list<initializer_list<int>>& matrix) { cout << size(matrix) << 'x' << size(*begin(matrix)) << " - SECONDn"; }
如果我调用foo({ 1, 2, 3 })
,则显然将调用1st。如果我调用foo({ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } })
,显然会调用2nd。
但如果我打电话给怎么办
foo({ { 1 }, { 2 }, { 3 } })
那些嵌套的大括号是int
-初始化器还是initializer_list<int>
初始化器?gcc说这是不明确的,但如果你把代码放在上面运行http://webcompiler.cloudapp.net/Visual Studio表示,它只是在构建一个initializer_list<int>
。谁是对的?这里应该有默认值吗?
规则在[over.ics.list]中:
否则,如果参数类型为
std::initializer_list<X>
,并且初始化器列表的所有元素都可以隐式转换为X
,则隐式转换序列是将列表的元素转换为X
所需的最差转换,或者如果初始化器列表没有元素,则为身份转换。
在这两个重载中,最糟糕的转换是身份转换。所以我们有两个具有秩恒等式的隐式转换序列。[over.match.best]中有一条规则,它更喜欢std::initializer_list<X>
的列表初始化,而不是备选方案(因此对于{1}
,std::initializer_list<int>
比int
更受欢迎(,但没有任何迹象表明该规则应该递归应用。
由于没有任何东西可以消除这两个转换序列的歧义,因此调用是不明确的。gcc和clang拒绝是正确的。
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么我的删除节点函数实际上没有删除节点?
- 其中降频广播实际上是有用的
- "Inverse SFINAE"避免模棱两可的过载
- 操作员C++的模棱两可的过载
- 模棱两可的重载模板
- "delete"在 C++ 中实际上做了什么?
- 调用重载的"<大括号括起来的初始值设定项列表>"对于对来说就足够了是模棱两可的
- C++:实际上不是从二进制文件中读取
- 模棱两可的 != reverse_iterator运算符
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- SFINAE不能防止模棱两可的操作员过载吗?
- VSCode 说 std::chrono 是模棱两可的,如果运算符<<重载
- 为什么对模板的调用不模棱两可?
- 修复重载运算符的使用'+'模棱两可?
- 为什么同时覆盖全局新运算符和特定于类的运算符不是模棱两可的行为?
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 为什么我们实际上需要运行时多态性?
- Antlr4 C++访问模棱两可的分支
- 这实际上是模棱两可的吗