Использует функцию-член в качестве аргумента для поведения конструктора 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.
Он вызывает функцию-член перед вызовом конструктора. Является ли поведение определенным стандартом?
Ответы
Ответ 1
§12.7 [class.cdtor]/p1:
Для объекта с нетривиальным конструктором, ссылаясь на любой нестатический член или базовый класс объекта перед конструктором начинает выполнение результатов в undefined.
Соответствующему компилятору разрешено испускать код, который удаляет ваши ноги.
Ответ 2
Да. На практике это может работать, потому что A::foo
не имеет никакого состояния из экземпляра a
. Вы никогда не должны писать такой код (и вы, вероятно, должны его исправить).