使用成员函数作为构造函数未定义行为的参数?

时间:2014-09-01 07:31:36

标签: c++ undefined-behavior

#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.

在调用构造函数之前调用成员函数。行为是由标准定义的吗?

2 个答案:

答案 0 :(得分:31)

§12.7[class.cdtor] / p1:

  

对于具有非平凡构造函数的对象,请参阅any   构造函数之前的对象的非静态成员或基类   开始执行导致未定义的行为。

允许符合标准的编译器发出吹掉你腿的代码。

答案 1 :(得分:4)

是。在实践中,它可能有效,因为A::foo不会从a实例中获取任何状态。你永远不应该写这样的代码(你应该纠正它)。