2009-08-28 12 views
9

Mam następujący kodBinding tymczasowy do lwartości odniesienia

string three() 
{ 
    return "three"; 
} 

void mutate(string& ref) 
{ 
} 

int main() 
{ 
    mutate(three()); 
    return 0; 
} 

Widać jestem przechodzącej trzy() do mutate metody. Ten kod dobrze się kompiluje. Rozumiem, że tymczasowe nie mogą być przypisane do odniesień stałych. Jeśli tak, w jaki sposób program się kompiluje?

Jakieś myśli?

Edit:

Kompilatory próbowałem: VS 2008 i VS2010 Beta

+0

Spróbuj GCC, to jest bardziej zbliżone do standardu C++. – Learner

+0

Niestety, nie mam ze sobą GCC. –

+0

@Appu: Po tym, jak poprawiłem twój kod pod kątem brakujących skrótów i prefiksów 'std', Comeau (http://www.comeaucomputing.com/tryitout/) mówi:' początkowa wartość odniesienia do nie-const musi być lwartością'. Powodem, dla którego VC to akceptuje jest to, że VC jest zepsuty. (Nazywają to "funkcją", ale w rzeczywistości jest to błąd). – sbi

Odpowiedz

8

Był używany do kompilacji w kompilatorze VC6, więc myślę, że utrzymanie kompilacji wstecznej VS2008 obsługuje to niestandardowe rozszerzenie. Wypróbuj z flagą /Za (wyłącz rozszerzenie języka), powinieneś wtedy otrzymać błąd.

+0

Świetnie! Teraz działa. –

+0

Określenie opcji '/ Za' może spowodować problemy z włączeniem nagłówków' windows.h' lub innych specyficznych dla systemu Windows. –

+5

Używanie poziomu ostrzegawczego jako cztery jest lepszą opcją, której użyłem – yesraaj

1

To nie kompilacji, z g ++ 4 co najmniej:

foo.cpp: In function ‘int main()’: 
foo.cpp:16: error: invalid initialization of non-const reference of type ‘std::string&’ from a temporary of type ‘std::string’ 
foo.cpp:10: error: in passing argument 1 of ‘void mutate(std::string&)’ 

(numery linii są wyłączone o 3 lub 4, ponieważ musiałem dodać linie #include i "using".)

Twój kompilator wydaje się nie być tak surowy, jak być powinien.

+0

Edytowany post i dodane kompilatory, których używam. –

0

Myślę, że to zależy od kompilatora. g ++ 4.1.2 daje mi to.

In function 'int main()': 
Line 15: error: invalid initialization of non-const reference of type 'std::string&' from a temporary of type 'std::string' 
compilation terminated due to -Wfatal-errors. 

Może dlatego, że nic nie robisz, połączenie jest zoptymalizowane.

+0

Próbowałem zrobić coś z parametrem ref wewnątrz metody mutate() i nadal kompiluje –

+0

Próbowałem go w VC++ właśnie teraz i kompiluje się i działa, chyba że wyłączysz rozszerzenia we właściwościach projektu. Kiedy to zrobisz, otrzymasz: 1> main.cpp 1> d: \ all \ projects \ laptop \ 2 \ asd \ asd \ main.cpp (16): błąd C2664: 'mutuj': nie można przekonwertować parametru 1 od 'std :: string' do 'std :: string &' 1> Nieograniczona referencja może być tylko powiązana z lwartością –

3

To rozszerzenie Microsoft, naśladujące zachowanie wielu innych kompilatorów Microsoft. Jeśli włączysz ostrzeżenia W4, zobaczysz ostrzeżenie.

Powiązane problemy