В соответствии с "Как обойти предупреждение "rvalue, используемое как lvalue" ?, Visual Studio будет просто предупреждать о коде, например:
int bar() {
return 3;
}
void foo(int* ptr) {
}
int main() {
foo(&bar());
}
В С++ не разрешается принимать адрес временного (или, по крайней мере, объекта, на который ссылается выражение rvalue?), и я думал, что это связано с тем, что временным ресурсам не гарантируется даже хранение.
Но тогда, хотя диагностика может быть представлена в любой форме, которую выбирает компилятор, я бы все же ожидал, что MSVS будет ошибкой, а не предупреждением в таком случае.
Итак, гарантированы ли временные хранилища? И если да, то почему приведенный выше код не разрешен в первую очередь?