Подтвердить что ты не робот

Использует функцию-член в качестве аргумента для поведения конструктора undefined?

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

Он вызывает функцию-член перед вызовом конструктора. Является ли поведение определенным стандартом?

4b9b3361

Ответ 1

§12.7 [class.cdtor]/p1:

Для объекта с нетривиальным конструктором, ссылаясь на любой нестатический член или базовый класс объекта перед конструктором начинает выполнение результатов в undefined.

Соответствующему компилятору разрешено испускать код, который удаляет ваши ноги.

Ответ 2

Да. На практике это может работать, потому что A::foo не имеет никакого состояния из экземпляра a. Вы никогда не должны писать такой код (и вы, вероятно, должны его исправить).