Я знаю, что в С++ 03 неконстантная ссылка не может быть привязана к rvalue.
T& t = getT();
недействителен, и в c++11 мы можем сделать так: T&& t = getT();
но как насчет приведенного выше кода, должен ли он работать в c++11?
Я протестировал приведенные ниже коды с помощью 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
- это пользовательский класс, я не понимаю, почему компилируются первые две строки. Временный объект, на который ссылается z
, уничтожается в конце внутренней области действия main. Стандарт что-то говорит об этом?
class Foo {
public:
Foo() {
std::cout << "constructed\n";
}
~Foo() {
std::cout << "destructed\n";
}
};
Я только что видел похожий вопрос: Одна ошибка VS2010? Разрешить привязку неконстантной ссылки к rvalue ДАЖЕ БЕЗ предупреждения?