Я с удивлением обнаружил, что следующие работы:
#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...
}
Я передаю адрес сконструированного объекта в свой собственный конструктор. Это похоже на круговое определение на уровне источника. Действительно ли стандарты позволяют вам передать объект в функцию до того, как объект будет построен даже, или это поведение undefined?
Я полагаю, что это не так странно, учитывая, что все функции-члены класса уже имеют указатель на данные для своего экземпляра класса как неявный параметр. А макет элементов данных фиксируется во время компиляции.
Заметьте, я не спрашиваю, полезно ли это или хорошая идея; Я просто возился, чтобы узнать больше о занятиях.