首页 > 后端开发 > C++ > 正文

最令人烦恼的解析是什么以及为什么它会发生在 C 11 中?

Barbara Streisand
发布: 2024-11-01 10:55:30
原创
773 人浏览过

What's the Most Vexing Parse and Why Does It Happen in C  11?

理解统一初始化器和最令人烦恼的解析

在 C 11 中,统一初始化器为初始化对象和数据结构提供了简洁的语法。然而,它们的使用可能会导致潜在的歧义,称为“最令人烦恼的解析”。

最令人烦恼的解析

考虑以下代码片段:

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

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 = Timer();

  • Timer() 可以解释为函数调用或对象构造。
  • 因为使用 auto 来声明 dv,所以它的类型是从右侧的表达式推导出来的。
  • 如果 Timer() 被解释为函数调用, dv 将是一个 int,因为 Timer() 不是一个返回对象的函数。
  • 但是,如果 Timer() 被解释为对象构造,则 dv 将是一个 Timer 对象。

int time_keeper(Timer());

  • Timer() 被解释为创建一个临时 Timer 对象。
  • time_keeper 的参数是指向返回 Timer 且不带任何参数的函数的指针。
  • 作为参数传递时,该函数会隐式转换为指针。
  • 因此,time_keeper 的类型为 int(Timer (*)())。

结论:

在“最令人烦恼的解析”场景中,编译器尝试推断一个基于上下文和规则的表达。通过了解这些规则如何应用,程序员可以避免歧义并以明确的意图编写代码。

以上是最令人烦恼的解析是什么以及为什么它会发生在 C 11 中?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!