【问题标题】:Why is object initialization different inside a struct? [duplicate]为什么结构内部的对象初始化不同? [复制]
【发布时间】:2021-10-23 02:51:48
【问题描述】:

我已经创建了一个类Point,这里是对应的hpp文件。

#ifndef POINT
#define POINT
class Point
{
 protected:
 int x;
 int y;
 public:
 Point(int x = 10, int y = 10);
 void movePoint(int moveX, int moveY);
 void printCoordinates();
};
#endif

我注意到,在主体中,我可以这样声明一个对象并对其进行初始化:

Point myPoint(1, 1);

如果我想创建一个包含两个点的结构,它不会让我这样初始化它,而是必须使用大括号,这样:

struct segment
{
 Point point1 = {0, 0};
 Point point2 = {15, 15};
};

这是为什么呢?

【问题讨论】:

  • 想象一下要求编译器在 template<typename B> class S : public B 中解析 int x(n);,其中不知道 nint,还是来自 B 的类型名

标签: c++ c++11 struct initialization member-initialization


【解决方案1】:

因为default member initializer(C++11 起)只支持等号初始化器和大括号初始化器。

(强调我的)

通过一个默认成员初始化器,它是包含在成员声明中的大括号或等号初始化器,如果该成员从一个成员初始化器列表中省略,则使用该成员构造函数。

所以你可以

struct segment
{
 Point point1 = {0, 0};        // equal-sign initializer
 Point point2 = Point(15, 15); // equal-sign initializer
 Point point3 = Point{30, 30}; // equal-sign initializer
 Point point4 {45, 45};        // braced initializer
};

Point myPoint(1, 1); 作为默认成员初始化器可能会导致函数声明的歧义问题。

【讨论】:

  • 这里应该更加强调函数声明的歧义。这实际上是不允许的核心原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2016-02-22
  • 2011-03-11
  • 2021-06-17
相关资源
最近更新 更多