为什么这种隐式转换会起作用,为什么会起作用

Why how and why this implicit conversion works

提问人:Александр Кушниренко 提问时间:5/13/2019 最后编辑:DeduplicatorАлександр Кушниренко 更新时间:5/13/2019 访问量:67

问:

我不明白为什么 c1 = {1, 2, 3, 4} 和 c2 = {5, 6, 7, 8} 工作正常,没有声明的构造函数,并且编译器生成的编译器不适合。

我试图通过显式转换来理解:(C&) { 1, 2, 3, 4} 和 (const C&) { 1, 2, 3, 4},但它不起作用。如果编译器为默认构造函数提供了初始值设定项列表,或者我从错误的一面解决了问题?

#include <cstdlib>
#include <iostream>
using namespace std;

namespace A001 {
class A { public: int a; double b; };
class B { public: int a; double b; };
class C { public: A a; B b; };
void test() {
    C c1 = { 1,2,3,4 }, c2 = { 5,6,7,8 };
        cout << c1.b.a + c2.a.b;
   }
}
C++ 初始化 C++17 复制构造函数 default-constructor

评论

0赞 Deduplicator 5/13/2019
阅读聚合初始化
0赞 Pete Becker 5/13/2019
请注意,它不是,如问题第一段中所写的那样,并且 .它是和(隐含的).c1 = {1, 2, 3, 4}c2 = {5, 6, 7, 8}C c1 = {1, 2, 3, 4}C c2 = {5, 6, 7, 8}
1赞 Barry 5/13/2019
“编译器生成的编译器”你的意思是......构造 函数?虽然编译器生成的编译器有一些东西让我认为我们已经走到了历史的尽头。
0赞 Александр Кушниренко 5/14/2019
是的,我的意思是构造函数,只是有点分心。我熟悉结构大括号初始化,但在类中遇到了这样的代码,所以有点困惑。

答:

1赞 Vittorio Romeo 5/13/2019 #1

这不是隐式转换,而是聚合初始化 + 大括号省略。例如

C c1 = { 1,2,3,4 }

相当于

C c1{ {1,2}, {3,4} }