【发布时间】:2015-12-13 00:45:44
【问题描述】:
我惊讶地发现以下工作:
#include <iostream>
int main(int argc, char** argv)
{
struct Foo {
Foo(Foo& bar) {
std::cout << &bar << std::endl;
}
};
Foo foo(foo); // I can't believe this works...
std::cout << &foo << std::endl; // but it does...
}
我将构造对象的地址传递给它自己的构造函数。这看起来像是源代码级别的循环定义。标准是否真的允许您在构建对象之前将对象传递给函数,或者这是未定义的行为?
我想这并不奇怪,因为所有类成员函数都已经有一个指向它们的类实例的数据的指针作为隐式参数。并且数据成员的布局在编译时是固定的。
注意,我不是在问这是有用还是好主意;我只是在修补以了解有关课程的更多信息。
【问题讨论】:
-
@ShafikYaghmour 你为什么删除你的答案?只需添加 [basic.life]p6 的引用即可。
-
是的,没关系;它本质上与在构造函数中使用
this相同,但存在所有缺陷。 -
这不是更像
size_t x = sizeof(x)吗?对象的构造函数在分配内存的点调用(来自未指定的源)。只要您只依赖于存储的属性,而不依赖于任何值解释,事情就应该是安全的。 -
@MSalters 关于存储是否分配在将对象绑定到引用之前,也就是在构造函数调用之前,存在一个微妙的问题。
-
Shafik,在你的建议下,我暂时不接受你的回答,虽然它对我来说已经很深了:)
标签: c++ class constructor language-lawyer undefined-behavior