#include <cstdio>
class A
{
public:
A(int){puts("3");};
int foo(){puts("4");return 10;}
};
int main()
{
A a(a.foo());
return 0;
}
输出4和3.
在调用构造函数之前调用成员函数。行为是由标准定义的吗?
答案 0 :(得分:31)
§12.7[class.cdtor] / p1:
对于具有非平凡构造函数的对象,请参阅any 构造函数之前的对象的非静态成员或基类 开始执行导致未定义的行为。
允许符合标准的编译器发出吹掉你腿的代码。
答案 1 :(得分:4)
是。在实践中,它可能有效,因为A::foo
不会从a
实例中获取任何状态。你永远不应该写这样的代码(你应该纠正它)。