C++ 最令人头疼的解析又来了

标签 c++ c++11 gotw

直接取自 http://herbsutter.com/2013/05/09/gotw-1-solution/

虽然 widget w(); 对我来说很清楚,但我不知道下面的代码如何成为函数声明?

// same problem (gadget and doodad are types)
//
widget w( gadget(), doodad() );  // pitfall: not a variable declaration

这怎么可能?

最佳答案

在函数声明中,数组类型的参数衰减为指向第一个元素的指针,函数类型的参数衰减为函数指针,因此签名将是:

widget w( gadget(*)(), doodad(*)() );

也就是说,一个函数将一个指向不带参数的函数的指针作为第一个参数并返回gadget,该函数将一个指向不带参数的函数的指针作为第二个参数并返回一个doodad 并且函数本身返回一个 widget

还有更有趣或更令人困惑的案例,例如:

// assume 'x' is a variable defined somewhere:
widget w(gadget(x));

那个怎么可能被解释为一个函数声明呢?我的意思是,x 是一个变量,对吧?好吧,当声明一个变量时,你可以添加额外的括号,所以 gadget x;gadget (x); 都声明了相同的变量 x。这同样适用于函数参数,所以上面的代码看起来像一个函数的声明,它接受一个名为 x 类型为 gadget 的第一个参数并返回一个 widget...

关于C++ 最令人头疼的解析又来了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16588750/

相关文章:

c++ - 通过动态内存管理防止自动变量销毁

C++:如何将 std::string 的内容写入 UTF-8 编码文件?

c++ - 作者在 GotW #53 中想表达什么?

c++ - 为什么不在 GotW 54 中调整和清除作品?

c++ - 非友元、非成员函数增加封装?

c++ - 如何将 gprof 与 autotools 一起使用?

c++ - 访问和打印元组中的数据,并使用 C++14 使用模板函数显示它

c++ - 编译我的 C++ 代码需要很长时间

c++ - pybind11 用于 C++14/C++17