Я знаю, что в C++ 03 привязка non-const не может быть привязана к значениям r.Является ли оно обязательным для привязки не-const lvalue-ссылок на rvalues в C++ 11? (Изменено)
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
является пользовательский класс, я не понимаю, почему первые две строки compiles.The временная ссылка на z
разрушается в конце внутренней объем основного. Стандарт говорит об этом?
class Foo {
public:
Foo() {
std::cout << "constructed\n";
}
~Foo() {
std::cout << "destructed\n";
}
};
Я только что видел подобный вопрос: One VS2010 bug ? Allowing binding non-const reference to rvalue WITHOUT EVEN a warning?
Интересно, как * несколько * Objective-C или Java программисты задают вопросы о языке, ориентированных на эзотерике, как «Справедливо ли связывать rvalues для не-const lvalue-reference ...? " Или нужно заниматься такими вещами, как «временные ссылки ... разрушенные в конце внутреннего пространства». Just sayin ';) – paulsm4
Не могли бы вы опубликовать, как вы определили Foo. – Gisway
правила привязки не изменились wrt Lvalue ссылки AFAIK –