最令人烦恼的解析:解开 C 11 中的歧义
C 11 中“最令人烦恼的解析”歧义在使用统一初始化器时会出现,如以下代码所示代码片段:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { auto dv = Timer(); // Ambiguity: Object or function call? int time_keeper(Timer()); // Ambiguity: Pointer or call? return 0; }</code>
理解第一个表达式 (auto dv = Timer())
在第一个表达式中,auto 关键字意味着 dv 的类型是从等号 (=) 右侧的初始值设定项推断出来。初始化程序是对不带参数的 Timer 构造函数的调用,它返回一个 Timer 对象。因此,dv 是 Timer 类型的对象。
理解第二个表达式 (int time_keeper(Timer()))
在第二个表达式中,出现歧义是因为编译器无法确定 Timer() 是函数调用还是传递过来的 Timer 类型的对象引用。
但是,因为函数在作为参数传递时会衰减为指针,所以 time_keeper 的真实类型是 int(Timer(*)()),这解决了有利于歧义的问题函数指针解释。
以上是最令人烦恼的解析:Timer() - 对象还是函数调用?的详细内容。更多信息请关注PHP中文网其他相关文章!