当宣布在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声纳);
基本意图是它们通常意味着相同的事情.最大的区别是花括号消除了你试图定义一个对象的"最令人烦恼的解析",但实际上最终却声明了一个函数.
所以,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,它将寻找一个重载,它将大括号中的元素作为参数(此时,你得到正常的重载分辨率,所以它基于最合适的,不只是"它可能被解释为适合所有人吗?")