C++ most vexing parse(C++最令人烦恼的解析)

本文介绍了C++中的一个语法歧义现象——Most Vexing Parse,它使得编译器在某些情况下将对象参数的创建误解析为函数类型的规约。这个问题在C++11引入uniform initialization后得以缓解。文章通过C风格类型转换和匿名临时变量的示例详细阐述了这一问题,并提供了相应的解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍与引入

最近在阅读C++ Concurrency in Action 2rd edition,在里面看到一个很有意思的说法叫做most vexing parse,是有关于C++中一种违反直觉的语法歧义解析现象。在某些情况下,C++语法解析器无法区分以下二者

  1. The creation of an object parameter,即对象参数的创建
  2. The specification of a function's type,即函数类型的规约。

发生歧义时,编译器解释为第2种情况,该现象也被称为most vexing parse,这种现象直到C++11 引入uniform initialization后才得到解决。

例一:C风格类型转换

考虑我们要进行一次C风格的强制类型转换

void f(double my_dbl) {
  int i(int(my_dbl));
}

第2行就有着多种解释。

  1. 新建一个int型变量,并用强制类型转换的my_db1进行初始化 。
  2. 声明一个形如下的函数 ,这是由于C语言允许参数被多余的括号包裹着。
int i (int my_db1);

例二:匿名的临时变量

一个更加详细且更常见的例子为:

struct Timer {};

struct TimeKeeper {
  explicit TimeKeeper(Timer t);
  int get_time();
};

int main() {
  TimeKeeper time_keeper(Timer
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值