gpt4 book ai didi

c++ - 如果第二个属性未进行大括号初始化,则与大括号初始化程序编译成对缩小转换

转载 作者:IT老高 更新时间:2023-10-28 21:57:51 25 4
gpt4 key购买 nike

c++11 起,list initialization 中不允许窄化转换(包括 aggregate initialization )。所以基本上:

char c{1000}; // Does not compile with g++, clang, vc

但是:

std::pair<char, double> p{1000, 1.0};

用所有编译器编译?

但是:

std::pair<char, double> p{1000, {1.0}};

不使用 VC 编译(错误 C2398),使用 clang 发出警告并使用 g++ 静默编译...

我希望 VC 行为无处不在,即不允许的缩小转换引发错误。哪个编译器是对的?


另一方面,以下代码段中的变量声明均未编译:

struct X {
char c;
double d;
};

X x1{999, 1.0};
X x2{999, {1.0}};

struct Y {
char c;
double d;
Y (char c, double d) : c(c), d(d) { }
};

Y y1{999, 1.0};
Y y2{999, {1.0}};

所以我的一个猜测可能是 std::pair 有什么特别之处?还会缩小大括号初始化的范围吗?

最佳答案

  1. std::pair<char, double> p{1000, 1.0};未诊断,因为它调用了 template<class U1, class U2> pair(U1&&, U2&&)构造函数(带有 U1 == intU2 == double ),这是完全匹配的;在您进入构造函数主体之前,不会发生缩小。

  2. std::pair<char, double> p{1000, {1.0}};无法调用该构造函数,因为 braced-init-list {1.0}是非推导上下文,所以不能推导 U2 .

关于c++ - 如果第二个属性未进行大括号初始化,则与大括号初始化程序编译成对缩小转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37928951/

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