A passagem de um objeto C ++ para seu próprio construtor é legal?

Surpreende-me descobrir acidentalmente que o seguinte funciona:

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

Estou passando o endereço do objeto construído para seu próprio construtor. Parece uma definição circular no nível da fonte. Os padrões realmente permitem que você passe um objeto para uma função antes mesmo que ele seja construído ou esse comportamento é indefinido?

Suponho que não seja tão estranho, uma vez que todas as funções de membro da classe já possuem um ponteiro para os dados da instância da classe como um parâmetro implícito. E o layout dos membros de dados é fixo no tempo de compilação.

Note, NÃO estou perguntando se isso é útil ou uma boa ideia; Estou apenas mexendo para aprender mais sobre as aulas.

questionAnswers(2)

yourAnswerToTheQuestion