gpt4 book ai didi

c++ - 这实际上是模棱两可的吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:23:29 24 4
gpt4 key购买 nike

所以我知道代码中的大括号不仅仅意味着 initializer_list。 : What Is a Curly-Brace Enclosed List If Not an intializer_list?

但是他们应该默认什么?

例如,假设我定义了一个重载函数:

void foo(const initializer_list<int>& row_vector) { cout << size(row_vector) << "x1 - FIRST\n"; }
void foo(const initializer_list<initializer_list<int>>& matrix) { cout << size(matrix) << 'x' << size(*begin(matrix)) << " - SECOND\n"; }

如果我调用 foo({ 1, 2, 3 })第 1st 显然会被调用。如果我调用 foo({ { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } })第二个nd 显然会被调用。

但是如果我调用:

foo({ { 1 }, { 2 }, { 3 } })

那些嵌套大括号是int -初始化器或initializer_list<int>初始化器? gcc says it's ambiguous但是,如果您获取该代码并在 http://webcompiler.cloudapp.net/ 上运行它Visual Studio 说它只是在构造一个 initializer_list<int> .谁是对的?这里应该有一个默认值吗?

最佳答案

规则在[over.ics.list] :

Otherwise, if the parameter type is std::initializer_list<X> and all the elements of the initializer list can be implicitly converted to X, the implicit conversion sequence is the worst conversion necessary to convert an element of the list to X, or if the initializer list has no elements, the identity conversion.

在您的两个重载中,最糟糕的必要转换是身份转换。所以我们有两个具有等级标识的隐式转换序列。 [over.match.best]中有一条规则它更喜欢 std::initializer_list<X> 的列表初始化超过替代方案(因此 std::initializer_list<int>int 更适合 {1} ),但没有任何迹象表明该规则应该递归应用。

由于没有任何东西可以消除两个转换序列的歧义,因此调用是不明确的。 gcc 和 clang 正确拒绝。

关于c++ - 这实际上是模棱两可的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38795374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com