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
的隐式转换构造函数?如果是这样,生成此构造函数的规则是什么以及如何工作?如果没有,为什么在没有警告的情况下进行编译? 最佳答案
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
这是对上述内容的扩展描述的摘录。在人类中,这意味着如果您有一个简单的类,则可以使用以相同方式布局的适当类型的列表对其进行初始化。 cppref页面显示了只要这些条件成立,您如何甚至可以嵌套类型。