ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

c++的“Most Vexing Parse”(最令人困惑的解析)

c++的“Most Vexing Parse”(最令人困惑的解析) Most Vexing Parse直译就是最令人困惑的解析。这是 C 中一个非常著名的语法歧义陷阱由 Scott Meyers 在《Effective STL》中首次命名。问题核心当写出看起来像“创建对象”的代码时编译器可能会把它解析成函数声明而不是你想要的对象定义。经典例子// 你以为你在创建一个对象std::vectorintv(std::istream_iteratorint(std::cin),std::istream_iteratorint());// 但编译器认为你在声明一个函数// 函数名v// 返回类型std::vectorint// 参数1名为 std::cin 的 istream_iteratorint// 参数2一个返回 istream_iteratorint 的函数指针更简单的例子// 你想创建一个 Widget 对象 wWidgetw();// 但编译器认为这是一个函数声明// 函数名w// 返回类型Widget// 参数无所以Widget w();不是创建对象而是声明了一个函数为什么叫“最令人困惑”因为代码看起来完全像在创建对象编译器却把它当成函数声明不会报错但运行结果完全不对很多经验丰富的程序员都会中招解决方法C11 之后用**花括号初始化统一初始化**就能避免// 用花括号编译器一定会当成创建对象Widget w{};// 正确创建对象std::vectorintv{1,2,3};// 正确创建对象// 而不是Widgetw();// 歧义可能被当成函数声明总结术语意思vex使烦恼、使困惑vexing令人烦恼的Most Vexing ParseC 中最令人困惑的语法歧义看起来像创建对象实际被编译器解析为函数声明解决方法用{}花括号初始化避免歧义一句话总结Most Vexing Parse C 最令人头疼的语法陷阱你写的代码看起来像创建对象编译器却当成了函数声明。用{}初始化可以完全避免。
返回列表