Почему 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 -?

0 ответов

Другие вопросы по тегам