首页 > 后端开发 > C++ > 正文

你可以将 C 对象传递给它自己的构造函数吗?

Linda Hamilton
发布: 2024-11-13 15:00:04
原创
165 人浏览过

Can You Pass a C   Object into Its Own Constructor?

将 C 对象传递到它们自己的构造函数中

在 C 中,这可能看起来违反直觉,但将 C 对象传递到其自己的构造函数中确实是合法的自己的构造函数。考虑以下代码片段:

#include <iostream>

struct Foo {
    Foo(Foo& bar) {
        std::cout << &bar << std::endl;
    }
};

int main(int argc, char** argv) {
    Foo foo(foo); // Surprising, yet valid
    std::cout << &foo << std::endl;
}
登录后复制

在此示例中,我们将构造的 Foo 对象 (&foo) 的地址传递到其自己的构造函数中。这可能类似于循环定义,但 C 标准不认为它是未定义的行为。

解释

该标准允许我们在之前以有限的方式使用未初始化的对象他们的完整初始化。具体来说,允许绑定对其的引用或获取其地址。这是在缺陷报告 363 和 C 14 标准草案第 3.8 节中定义的。

这意味着在上面的代码中,我们没有违反该语言设置的任何约束。我们只是以符合标准的方式在构造函数中使用未初始化的 foo 对象。

Clang 的警告

但是,值得注意的是,某些编译器就像 Clang 可能会发出有关未初始化变量的警告。这是因为从未初始化的自动变量生成不确定的值通常被认为是未定义的行为。不过,在这种情况下,我们不会引入不确定性,因为我们只是绑定引用并在构造函数中获取地址。

限制

重要的是要强调尽管标准允许这种行为,但不应将其视为良好实践或有任何实际用例。本次讨论的主要目的是阐明 C 语言语义中鲜为人知的方面。

以上是你可以将 C 对象传递给它自己的构造函数吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

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