最令人烦恼的解析:解开 C 11 中的歧义
当使用统一初始化器时,C 11 中的“最令人烦恼的解析”歧义会出现,如以下代码片段所示:
#include
class Timer
{
public:
Timer() {}
};
int main()
{
auto dv = Timer(); // Ambiguity: Object or function call?
int time_keeper(Timer()); // Ambiguity: Pointer or call?
return 0;
}
理解第一个表达式 (auto dv = Timer())
在第一个表达式中,auto 关键字意味着 dv 的类型是从初始化器推断出来的位于等号 (=) 的右侧。初始化程序是对不带参数的 Timer 构造函数的调用,它返回一个 Timer 对象。因此,dv 是 Timer 类型的对象。
理解第二个表达式 (int time_keeper(Timer()))
在第二个表达式中,出现歧义是因为编译器无法确定 Timer() 是函数调用还是通过引用传递的 Timer 类型的对象。
然而,因为函数在作为参数传递时会衰减为指针,所以 time_keeper 的真正类型是 int(Timer(*)()),这解决了有利于指针的歧义-函数解释。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3