结构的隐式列表初始化构造函数

时间:2017-11-10 02:12:34

标签: c++ c++11 implicit-conversion

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的隐式转换构造函数?如果是这样,生成此构造函数及其工作原理的规则是什么?如果没有,为什么这会在没有警告的情况下编译?

1 个答案:

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