Почему std::declval <int> () не является lvalue, когда std::declval <int&> () имеет значение?
Первая из этих двух строк не компилируется, вторая компилируется в MSVC 2017:
// std::cout << sizeof(decltype(++std::declval<int>())) << "\n"; //error. expression must be a modifiable lvalue.
std::cout << sizeof(decltype(++std::declval<int&>())) << "\n";
Сообщение об ошибке: «выражение должно быть изменяемым lvalue».
я знаю это
declval
добавляет ссылку на rvalue. Итак, в первой строке компилятор рассматривает (не так ли?) Результат
std::declval<int>()
быть ссылкой на rvalue. Во второй строке компилятор рассматривает результат
std::declval<int&>()
быть ссылкой lvalue из-за правил сворачивания.
Почему ссылка rvalue не является изменяемым lvalue, а ссылка lvalue -?