c ++用花括号声明对象

One*_*nDc 4 c++ declaration

宣布在C++对象-

有什么区别

MyClass myObj (a,b,c);
Run Code Online (Sandbox Code Playgroud)

(我理解这是调用带有三个参数的构造函数)

MyClass myObbj{a,b,c};
Run Code Online (Sandbox Code Playgroud)

不确定这里的花括号是什么意思?

作为参考,我使用以下代码

// Inertial Navigation EKF
NavEKF EKF{&ahrs, barometer, sonar};
AP_AHRS_NavEKF ahrs{ins, barometer, gps, sonar, EKF};
Run Code Online (Sandbox Code Playgroud)

1.在NavEKF EKF中是否使用大括号{&ahrs,barometer,sonar}; c ++标准的一部分.gcc 4.6.1抱怨 - 函数定义不声明参数.

2.给定AP_AHRS_NavEKF ahrs;

AP_Baro晴雨表;

RangeFinder声纳;

2A.为什么编译器会抱怨这个

NavEKF EKF(&ahrs,晴雨表,声纳);

但允许这个

NavEKF EKF(AP_AHRS_NavEKF&ahrs,AP_Baro晴雨表,RangeFinder声纳);

Jer*_*fin 8

基本意图是它们通常意味着相同的事情.最大的区别是花括号消除了你试图定义一个对象的"最令人烦恼的解析",但实际上最终却声明了一个函数.

所以,NavEKF EKF{&ahrs, barometer, sonar};平时要等同于NavEKF EKF(&ahrs, barometer, sonar);.但是,如果你有类似的东西:NavEKF EKF();NavEKF EKF{};它们不同 - NavEKF EKF();声明一个名为EKF的函数,它不接受任何参数并返回a NavEKF,而NavEKF EKF{};你做(可能)通常期望的那样,并创建一个名为EKF的默认初始化对象类型NavEKF.

然而,有些情况下,对于如何解释事物存在歧义,并且根据您是否使用括号或括号来解决歧义.特别是,如果你使用花括号,并且有任何方法可以将内容解释为initializer_list,那就是它的解释方式.当且仅当它失败时,所以它不能被视为initializer_list,它将寻找一个重载,它将大括号中的元素作为参数(此时,你得到正常的重载分辨率,所以它基于最合适的,不只是"它可能被解释为适合所有人吗?")