首页 > 后端开发 > C++ > C 统一初始化何时成为'最令人烦恼的解析”?

C 统一初始化何时成为'最令人烦恼的解析”?

DDD
发布: 2024-11-01 21:37:29
原创
1062 人浏览过

When Does C   Uniform Initialization Become the

理解 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板