在 C 中将对象传递到它自己的构造函数中
一些 C 程序员发现了一个有趣的行为:将对象传递到它自己的构造函数中。这引发了关于这种做法在 C 中是否合法或被视为未定义行为的问题。
考虑以下代码片段:
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main() { Foo foo(foo); // Surprisingly, this compiles and executes std::cout << &foo << std::endl; }
在此代码中,Foo 构造函数接收对在对象完全初始化之前构造对象本身。尽管对象未初始化,但该代码是 C 标准允许的。
C 14 标准草案第 3.8 节阐明,在对象的生命周期开始之前(或结束之后),允许获取其地址或者绑定一个引用,只要该引用可以直接绑定即可。仅当对此类部分初始化的对象执行某些操作(例如左值到右值转换、访问非静态数据成员或虚拟基类绑定)时,才会出现未定义的行为。
提供的代码示例不会违反任何这些限制。我们只是绑定一个引用并在构造函数中获取地址,这是允许的。
然而,活跃的问题 453 引起了对将引用绑定到未初始化对象的有效性的担忧。最初提出的语言支持缺陷报告 363,它允许进行此类绑定,如代码片段中所示。
虽然这种行为最初可能看起来很奇怪,但它是编译器在初始化之前为对象分配空间的结果。这允许有限的操作,例如引用绑定和地址检索,而不会产生不确定的值。
以上是你能在 C 语言中将一个对象传递给它自己的构造函数吗?的详细内容。更多信息请关注PHP中文网其他相关文章!