专栏首页光城(guangcity)C++二义性问题之Most Vexing Parse

C++二义性问题之Most Vexing Parse

Most Vexing Parse

0.导语

Most Vexing Parse 翻译为最烦人的解析,在使用 C++11 中 std::thread 创建对象的时候会遇到这种问题,除此之外,也会遇到,本文来看看在哪些场景可以遇到以及在 C++11 标准后的解决方案。

1.自己编写一个类

假设自己写了这么一个类,我们想调用 copy 构造:

class String {
public:
    String() {
        cout << "dctor" << endl;
    }

    String(const string &name) {
        cout << name << endl;
    }
};

调用实现:

int main() {
    char *t = "helloworld";
    String s(string(t));        // no result
    return 0;
}

这种没有任何结果输出,理想情况下,我们会认为它会调用所谓的拷贝构造,可事实呢,这行被编译器认为是函数声明!

上述传递的是一个匿名对象,被解析成了函数名为 s,带了一个参数(函数指针指向参数 t 并返回 string 对象的函数),返回一个 String 对象的函数声明。

像这种问题被称为:"Most Vexing Parse"。

2.解决方案

Scott Meyers 在 Effective C++中提到有如下解决方案:

String s((string(t)));        // ok

在外部再次添加一个括号!

另外在 C++11 中也可以使用 Uniform initialization(统一初始化)来处理这种歧义:

String ss{string(t)};        // ok

3.总结

这是一个经典的二义性问题,针对这种问题,我们应该避免写出这种代码,如果写出来了,可以采用文中两种方案来进行解决,从而避免歧义。

本文分享自微信公众号 - 光城(guangcity),作者:lightcity

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++ 动态新闻推送 第1期

    每周日推送从reddit/hackernews/lobsters/meetingcpp摘抄一些c++动态。

    王很水
  • [Effective Modern C++(11&14)]Chapter 3: Moving to Modern C++

    昊楠Hacking
  • 【论文推荐】最新7篇视觉问答(VQA)相关论文—解释、读写记忆网络、逆视觉问答、视觉推理、可解释性、注意力机制、计数

    【导读】专知内容组整理了最近七篇视觉问答(Visual Question Answering)相关文章,为大家进行介绍,欢迎查看! 1.VQA-E: Expla...

    WZEARW
  • DSL parser 和 PromQL

    PromQL (Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,内置函数很...

    王磊-AI基础
  • Stanford公开课《编译原理》学习笔记(2)递归下降法

    课程里涉及到的内容讲的还是很清楚的,但个别地方有点脱节,建议课下自己配合经典著作《Compilers-priciples, Techniques and Too...

    大史不说话
  • 【置顶】Python开发中常见问题参考资料:问题汇总:

    如果我们在outside.py文件中调用hub.py时,就会打印出this message should not be shown out of this fi...

    keloli
  • 从“London”出发,8步搞定自然语言处理(Python代码)

    【新智元导读】自然语言处理是AI的一个子领域,从人们日常沟通所用的非结构化文本信息中提取结构化数据,以便计算机理解。本文用通俗易懂的语言深入浅出的介绍了自然语言...

    新智元
  • LSA概述与实例

    LSA概述 Latent Semantic Analysis简单来说,就是将word和document透射到concept space,然后在concept s...

    用户1147754
  • ESTER:一个用于事件语义关系推理的机器阅读理解数据集

    故事和叙事是在各种事件的基础上构成的。了解这些事件之间的语义关系是阅读理解的本质。最近以事件为中心的阅读理解数据集侧重于事件论证或事件时间常识。尽管这些任务评估...

    用户8436237
  • 三十分钟成为 Contributor | 提升 TiDB Parser 对 MySQL 8.0 语法的兼容性

    TiDB 的一大特性就是和 MySQL 高度兼容,目标是让用户能够无需修改代码即可从 MySQL 迁移至 TiDB。要达成这个目标,需要完成两个提升兼容性的任务...

    PingCAP
  • 【玩转 WordPress】— 史上最快速搭建 WordPress 教程

    以下内容来自「玩转腾讯云」用户原创文章,已获得授权。 01. 什么是 Serverless? 在《Serverless Architectures》中对 Se...

    腾讯云serverless团队
  • [工具]7个应知的Python库

    在我多年的Python编程生涯中,以及在GitHub上探索漫游,我碰到了一些库,用起来特别愉快,这篇文章,就是来扩散这方面的知识。我决定排除很优秀的几个库,像...

    小莹莹
  • 夯实Python基础(7)

    Python标准库,是Python程序员应该熟悉了解的又一个宝库。Python 标准库非常庞大,所提供的组件涉及范围十分广泛。简要描述如下:

    高一峰
  • 计算机如何理解我们的语言?NLP is fun!

    【导读】我们从日常每天都会用到的推荐系统到现在研究火热的开放性聊天、对话机器人,越来越多的产品与应用的背后都需要自然语言处理(NLP)和知识图谱的技术。也有越来...

    AI科技大本营
  • 转--我们为什么选择Golang重构Worker系统

    之前发了一篇帖子,讲了暴漫用golang重构了worker系统,有好多朋友问到语言选择的问题。 其实在用Golang重写我们的worker系统之前是做过很多调研...

    李海彬
  • 使用OpenCV和Python计算图像的“色彩”

    【Computing image “colorfulness” with OpenCV and Python】,仅做学习分享。

    周旋
  • ESTER:一个用于事件语义关系推理的机器阅读理解数据集

    故事和叙述是根据各种事件写成的。理解这些事件在语义上是如何相互联系的是阅读理解的本质。以事件为中心的阅读理解数据集中在事件参数或事件时间常识上。尽管这些任务评估...

    猪猪奶茶三分糖
  • Protocol Buffers(2):编码与解码

    在上一篇文章中我们提到,对于序列化后字节流,需要回答的一个重要问题是“从哪里到哪里是哪个数据成员”。

    李拜六不开鑫
  • Apache Struts2 Remote Code Execution (S2-046)

    风流

扫码关注云+社区

领取腾讯云代金券