Во-первых, есть разница между «модификацией временного объекта» и «модификацией объекта через значение». Я рассмотрю последнее, так как первое не очень полезно обсуждать [1].
Я нашел следующее в 3.10/10
(3.10/5
в C ++ 11):
Необходимо lvalue для объекта
для того, чтобы изменить объект, кроме
что значение класса также может
использоваться для изменения своего референта под
определенные обстоятельства. [Пример:
функция-член, вызываемая для объекта
(9.3) может изменить объект. ]
Итак, значения не являются const
per se, но они являются неизменяемыми при любых, кроме некоторых определенных обстоятельствах.
Однако то, что вызов функции-члена может изменить значение r, может показаться мне указанием на то, что подавляющее большинство случаев для модификации объекта через значение r удовлетворяются .
В частности, утверждение (в исходном вопросе, с которым я связан), что (obj1+obj2).show()
недопустимо для не const
show()
[тьфу, почему ?!] было ложным.
Таким образом, ответ (слегка изменяя формулировку вопроса для заключения), что значения , к которым осуществляется доступ через функции-члены , не по своей сути неизменяемы.
[1] - Примечательно, что если вы можете получить lvalue для временного значения из исходного rvalue, вы можете сделать с ним как угодно :
#include <cstring>
struct standard_layout {
standard_layout();
int i;
};
standard_layout* global;
standard_layout::standard_layout()
{
global = this;
}
void modifying_an_object_through_lvalue(standard_layout&&)
{
// Modifying through an *lvalue* here!
std::memset(global, 0, sizeof(standard_layout));
}
int main()
{
// we pass a temporary, but we only modify it through
// an lvalue, which is fine
modifying_an_object_through_lvalue(standard_layout{});
}
(Спасибо Люку Дантону за код!)