gpt4 book ai didi

c++ - 采用 std::initializer_list 的构造函数优于其他构造函数

转载 作者:行者123 更新时间:2023-12-04 04:27:03 25 4
gpt4 key购买 nike

我用带有标志 -std=c++17 的 GCC 11.1.0 编译下面的代码.发生在标准输出上打印 initializer_list .
我用带有标志 -std=c++17 的 MSVC 编译了相同的代码但它打印了“复制构造函数”。哪个编译器更符合cpp标准?编译器可以自由选择构造函数之一吗?

#include <iostream>
using namespace std;

struct S
{
S(int) { }
S(initializer_list<int>) { cout << "initializer_list"; }
S(const S&) { cout << "copy constructor"; }

operator int() const { return 1; };
};

int main()
{
S s1(20);
S s2{ s1 };
}

最佳答案

对于这样的东西,编译器几乎从来没有“自由选择”。如果是这样,我们几乎无法编写任何可移植的 C++ 代码。
[over.match.list]确实优先initializer_list构造器。 rules of list initialization下的构造函数重载在 step 3.6 处被调用.步骤 3.1-3.5 不适用,因为您的类型不符合任何这些情况。步骤 3.1 特别有趣,因为它专门用于调用复制构造函数而不是做其他事情,但它也仅适用于聚合。你的类型不是。
由于您的类型可以隐式转换为 int ,并且您的类型采用 initializer_list<int> ,有一个有效的方法来构建 initializer_list匹配相关类型的构造函数。因此,这是 [over.match.list] 将选择的构造函数。
所以在这种情况下,VC++是错误的。如 is Clang , 显然。

关于c++ - 采用 std::initializer_list 的构造函数优于其他构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68328782/

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