【发布时间】:2017-11-10 02:12:34
【问题描述】:
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 的隐式转换构造函数?如果是这样,何时生成此构造函数以及它如何工作的规则是什么?如果不是,为什么编译时没有警告?
【问题讨论】:
-
Aggregate initialization 和
returnstatement, form (2)。 Brace-init 列表可以出现在return语句中,这种情况下返回值是从它初始化的,类似于Coord ret{0.0, 0.0}; return ret; -
谢谢,一个指向聚合初始化页面的链接和一个关于聚合的简要总结和括号初始化列表的规则将是一个很好的答案。
标签: c++ c++11 implicit-conversion