7 Stimmen

Objekt mit sich selbst als Referenz konstruieren?

Ich habe gerade festgestellt, dass dieses Programm kompiliert und läuft (gcc Version 4.4.5 / Ubuntu):

#include <iostream>
using namespace std;

class Test
{
public:
  // copyconstructor
  Test(const Test& other);
};

Test::Test(const Test& other)
{
  if (this == &other)
    cout << "copying myself" << endl;
  else
    cout << "copying something else" << endl;
}

int main(int argv, char** argc)
{
  Test a(a);              // compiles, runs and prints "copying myself"
  Test *b = new Test(*b); // compiles, runs and prints "copying something else"
}

Ich frage mich, warum in aller Welt dies überhaupt kompiliert wird. Ich gehe davon aus, dass (genau wie in Java) Argumente ausgewertet werden, bevor die Methode / der Konstruktor aufgerufen wird, daher vermute ich, dass dieser Fall durch einen "Sonderfall" in der Sprachspezifikation abgedeckt sein muss?

Fragen:

  1. Könnte jemand dies erklären (vorzugsweise unter Bezugnahme auf die Spezifikation)?
  2. Welche Gründe sprechen dafür, dies zuzulassen?
  3. Ist es Standard-C++ oder ist es gcc-spezifisch?

EDIT 1: Ich habe gerade festgestellt, dass ich sogar schreiben kann int i = i;

EDIT 2: Auch mit -Wall y -pedantic beschwert sich der Compiler nicht über Test a(a); .

EDIT 3: Wenn ich eine Methode hinzufügen

Test method(Test& t)
{
  cout << "in some" << endl;
  return t;
}

Ich kann sogar Test a(method(a)); ohne jegliche Warnungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X