Wiem, że w C++ 03, niestanowiące odniesienia nie mogą być powiązane z wartościami r.Czy poprawne jest wiązanie nie-stałych wartości l-odniesień do wartości r w C++ 11? (Zmodyfikowane)
jest nieważny, aw języku C++ 11 możemy to zrobić: T&& t = getT();
, ale co z powyższym kodem, czy to powinno działać w C++ 11?
Testowałem kody poniżej vs11:
Foo getFoo() {
return Foo();
}
void fz(Foo& f) {
}
int getInt() {
return int();
}
void iz(int& i) {
}
int main() {
{
Foo& z = getFoo(); //ok
fz(getFoo()); //ok
int& z2 = getInt(); //error: initial value of reference to non-const must be an lvalue
iz(getInt()); //same as above
}
}
Foo
to klasa zwyczaj, nie rozumiem, dlaczego dwie pierwsze linia compiles.The tymczasowy odwołuje z
jest zniszczona pod koniec wewnętrzna zakres główny. Czy standard mówi coś na ten temat?
class Foo {
public:
Foo() {
std::cout << "constructed\n";
}
~Foo() {
std::cout << "destructed\n";
}
};
Właśnie widziałem podobne pytanie: One VS2010 bug ? Allowing binding non-const reference to rvalue WITHOUT EVEN a warning?
To ciekawe, jak * kilka * programistów Objective-C lub Java zadawać pytania na temat języka zorientowanego ezoteryki jak „Czy to ważne, aby związać rvalues do niestałych wartości l-odniesień ...? " Albo muszą się zajmować takimi rzeczami jak "tymczasowe odniesienia ... zniszczone na końcu wewnętrznego zakresu". Po prostu mów:;) – paulsm4
Czy mógłbyś opublikować, jak zdefiniowałeś Foo? – Gisway
wiążące zasady nie uległy zmianie W przypadku Lvalue odniesienia AFAIK –