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页面显示了只要这些条件成立,您如何甚至可以嵌套类型。

09-10 04:05
查看更多