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