首页  >  文章  >  后端开发  >  最令人烦恼的解析:Timer() - 对象还是函数调用?

最令人烦恼的解析:Timer() - 对象还是函数调用?

Patricia Arquette
Patricia Arquette原创
2024-10-31 18:09:01201浏览

The Most Vexing Parse: Timer() - Object or Function Call?

最令人烦恼的解析:解开 C 11 中的歧义

C 11 中“最令人烦恼的解析”歧义在使用统一初始化器时会出现,如以下代码所示代码片段:

<code class="cpp">#include <iostream>

class Timer
{
public:
    Timer() {}
};

int main()
{
    auto dv = Timer(); // Ambiguity: Object or function call?
    int time_keeper(Timer()); // Ambiguity: Pointer or call?
    return 0;
}</code>

理解第一个表达式 (auto dv = Timer())

在第一个表达式中,auto 关键字意味着 dv 的类型是从等号 (=) 右侧的初始值设定项推断出来。初始化程序是对不带参数的 Timer 构造函数的调用,它返回一个 Timer 对象。因此,dv 是 Timer 类型的对象。

理解第二个表达式 (int time_keeper(Timer()))

在第二个表达式中,出现歧义是因为编译器无法确定 Timer() 是函数调用还是传递过来的 Timer 类型的对象引用。

  • 如果 Timer() 是函数调用,则 int time_keeper(Timer()) 声明一个名为 time_keeper 的函数,该函数接受 Timer 对象作为输入并返回 int。
  • 如果 Timer() 是 Timer 类型的对象,则 int time_keeper(Timer()) 声明一个名为 time_keeper 的函数,该函数采用指向 Timer 对象的指针作为输入并返回 int。

但是,因为函数在作为参数传递时会衰减为指针,所以 time_keeper 的真实类型是 int(Timer(*)()),这解决了有利于歧义的问题函数指针解释。

以上是最令人烦恼的解析:Timer() - 对象还是函数调用?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn