GCC 5.4在没有任何警告的情况下编译它(使用-std=c++11 -Wall -pedantic
):
#include <iostream>
struct Coord {
double x, y;
};
Coord origin() {
return {0.0, 0.0};
}
int main() {
Coord c = origin();
std::cout << "(" << c.x << ", " << c.y << ")\n";
}
看起来{0.0, 0.0}
创建了一个std::initializer_list
,用于构造Coord,即使我没有定义这样的构造函数。
结构体是否具有std::initializer_list
的隐式转换构造函数?如果是这样,生成此构造函数及其工作原理的规则是什么?如果没有,为什么这会在没有警告的情况下编译?
答案 0 :(得分:0)
“同样,我们可以初始化我们没有的类的对象 使用•memberwise初始化定义构造函数,•copy 初始化,或•默认初始化(没有初始化程序或 使用空的初始化列表)。例如:
struct Work {
string author;
string name;
int year;
};
Work s9 { "Beethoven",
"Symphony No. 9 in D minor, Op. 125; Choral",
1824
}; // memberwise initialization
Work currently_playing { s9 }; // copy initialization
Work none {}; // default initialization”
摘录自:Bjarne Stroustrup。 “C ++编程语言,第四版。”
此外,这里是cppreference: http://en.cppreference.com/w/cpp/language/aggregate_initialization
类类型(通常是struct或union),没有private或 受保护的非静态数据成员没有用户提供,继承或 显式(自C ++ 17)构造函数(显式默认或删除) 允许构造函数)(因为C ++ 11)没有虚拟,私有或 protected(自C ++ 17以来)基类没有虚拟成员函数没有 默认成员初始值设定项
以上是对上述扩展说明的摘录。在人类中,这意味着如果你有一个简单的类,你可以使用相同类型的列表初始化它,以相同的方式布局。 cppref页面显示了只要这些条件成立,您甚至可以嵌套类型。