Знам, че в c++03 неконстантна препратка не може да бъде обвързана с rvalues.
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 ДОРИ БЕЗ предупреждение?