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:
- Könnte jemand dies erklären (vorzugsweise unter Bezugnahme auf die Spezifikation)?
- Welche Gründe sprechen dafür, dies zuzulassen?
- 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.