【问题标题】:Struct initialization with {} and ()使用 {} 和 () 进行结构初始化
【发布时间】:2021-09-03 19:21:31
【问题描述】:

当我有一个结构时

   struct Point
    {
    int x;
    int y;
    int z;
    }

为什么可以写作

Point p = {10, 20, 30};
Point p0 {10, 20, 30};
auto p1 = Point{10, 20, 30};

使用 {}。但我不能用 () 写

Point p(10,10,10);
auto p1 = Point(10,10,10);

有错误

Error   C2440   'initializing': cannot convert from 'initializer list' to 'Point '  

【问题讨论】:

  • (...) 是函数调用的语法工具。在这种情况下,它是对构造函数的调用,但您还没有定义构造函数! C++20 改变了这一点,并将使其编译(以更复杂和令人困惑的 IMO 规则为代价)。

标签: c++ class oop c++11 initialization


【解决方案1】:

从 C++20 开始,您可以使用括号初始化器执行 aggregate-initialization

T object (arg1, arg2, ...);   (5) (since C++20)

在C++20之前,Point p(10,10,10);应该调用Point的构造函数,取3个ints,但Point没有这样的构造函数。正如您所展示的,您必须使用大括号初始化程序来执行聚合初始化,或者为Point 提供这样的构造函数,然后您可以同时使用括号和大括号初始化程序。

【讨论】:

  • 那么在创建对象方面 {} 和 () 有什么不同?那么对象是以不同的方式创建的吗?
  • @Display 是的,C++中有很多不同的initializations,它们有不同的风格和效果。
  • @Display • Nicolai Josuttis 甚至在The Nightmare of Initialization in C++ 上做了一个长达一小时的精彩演示。
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-26
  • 2016-06-23
  • 2023-03-16
  • 1970-01-01
相关资源
最近更新 更多