理解 C 统一初始值设定项中“最令人烦恼的解析”歧义
“最令人烦恼的解析”是指以下情况下可能出现的歧义:在 C 11 中使用统一的初始化语法。当不清楚代码表达式是在初始化对象还是调用返回对象的函数时,就会出现这种歧义。
为了说明这种歧义,请考虑以下代码:
<code class="cpp">#include <iostream> class Timer { public: Timer() {} }; int main() { // Case 1: Initializing an object auto dv = Timer(); // Case 2: Calling a function int time_keeper(Timer()); return 0; }</code>
情况 1:初始化对象
在第一种情况下, auto dv = Timer() 初始化一个名为 dv 的 Timer 类型的对象。 dv 的类型被推断为 Timer,因为我们使用 auto 来声明它。
情况 2:调用函数
第二种情况,int time_keeper(Timer ()) 声明了一个名为 time_keeper 的函数,该函数返回一个 int 并以一个指向返回 Timer 且不带任何参数的函数的指针为参数。
参数不是 Timer 的原因 (*) ()是函数在作为参数传递时衰减为指针。因此,time_keeper 的类型实际上是 int(Timer(*)())。
可以通过显式指定要初始化的变量的类型或显式声明函数的签名来避免这种歧义。例如:
<code class="cpp">// Explicitly specify the type of the variable auto dv: Timer = Timer(); // Explicitly declare the function's signature int time_keeper(Timer (*)());</code>
以上是C 统一初始化何时成为“最令人烦恼的解析”?的详细内容。更多信息请关注PHP中文网其他相关文章!