首页  >  文章  >  后端开发  >  `Timer()` 是构造函数调用还是函数调用? C 语言中“最令人烦恼的解析”歧义

`Timer()` 是构造函数调用还是函数调用? C 语言中“最令人烦恼的解析”歧义

Susan Sarandon
Susan Sarandon原创
2024-11-02 13:25:30854浏览

Is `Timer()` a Constructor Call or a Function Call? The

“最令人烦恼的解析”歧义:解开统一初始化器

在 C 领域,可能会出现“最令人烦恼的解析”歧义当遇到统一初始值设定项时,如以下代码所示:

<code class="cpp">class Timer {
public:
    Timer() {}
};

int main() {
    auto dv = Timer(); // What is Timer() ? And what type is dv?
    int time_keeper(Timer()); // This is a function right? And why isn't the argument "Timer (*) ()"?
    return 0;
}</code>

解释 dv

auto dv = Timer(); 行中,dv 的类型取决于 Timer() 的解释。这可以是:

  • 构造函数调用,实例化 Timer 类型的对象。
  • 对 Timer 中假设的 operator() 重载的函数调用,因为可以使用统一初始化调用函数。

在这种情况下,它表示构造函数调用,导致 dv 成为 Timer 类型的对象。 auto 关键字根据初始值设定项推断类型。

理解 time_keeper

在 int time_keeper(Timer()); 行中,声明了一个名为 time_keeper 的函数。正如人们所期望的那样,该参数不是 Timer (*) () 类型的函数指针。相反,它表示一个指向返回 Timer 且不带参数的函数的指针。这是因为:

  • 当作为参数传递时,函数隐式衰减为指向函数的指针。
  • 在此特定实例中,函数调用衰减为指向返回 a 的函数的指针。 Timer 且不带任何参数,即 Timer(*)()。

结论

“最令人烦恼的解析”歧义凸显了混淆的可能性在解释 C 中的某些结构时。理解统一初始化和函数衰减的概念对于正确理解此类场景至关重要。

以上是`Timer()` 是构造函数调用还是函数调用? C 语言中“最令人烦恼的解析”歧义的详细内容。更多信息请关注PHP中文网其他相关文章!

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