介绍与引入
最近在阅读C++ Concurrency in Action 2rd edition,在里面看到一个很有意思的说法叫做most vexing parse,是有关于C++中一种违反直觉的语法歧义解析现象。在某些情况下,C++语法解析器无法区分以下二者
- The creation of an object parameter,即对象参数的创建
- 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行就有着多种解释。
- 新建一个
int
型变量,并用强制类型转换的my_db1
进行初始化 。 - 声明一个形如下的函数 ,这是由于C语言允许参数被多余的括号包裹着。
int i (int my_db1);
例二:匿名的临时变量
一个更加详细且更常见的例子为:
struct Timer {};
struct TimeKeeper {
explicit TimeKeeper(Timer t);
int get_time();
};
int main() {
TimeKeeper time_keeper(Timer