最令人烦恼的解析混乱:澄清歧义
在 C 11 中,统一初始化器引入了一种微妙的歧义,称为“最令人烦恼的解析”。让我们深入研究一个演示此问题的示例:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { auto dv = Timer(); // What is Timer() ? And what type is dv? int time_keeper(Timer()); // This is a function right? And why isn't the argument " Timer (*) ()"? return 0; }</code>
分析:
第一行:
<code class="cpp">auto dv = Timer();</code>
第二行:
<code class="cpp">int time_keeper(Timer());</code>
为了证明这一点,请考虑以下程序:
<code class="cpp">#include <type_traits> struct Timer { }; int main() { int time_keeper(Timer()); static_assert( std::is_same< decltype(time_keeper), int(Timer(*)()) >::value, "This should not fire!"); }</code>
该程序编译成功,确认 time_keeper 将指向函数的指针作为参数。
总之,“最令人烦恼的解析”混乱源于这样一个事实:表达式 Timer() 可以解释为Timer 类型的对象或指向返回 Timer 的函数的函数指针。正确的解释取决于使用该表达式的上下文。
以上是'Timer()”是函数还是对象?理解 C 11 中的'最令人烦恼的解析”。的详细内容。更多信息请关注PHP中文网其他相关文章!