Это правило применяется только к объектам встроенного типа, например int
.
. Это не относится к классам.
Правило, вероятно, считалось слишком ограничительным для классов, чьиоператоры могут быть перегружены для выполнения различных задач ... или, возможно, они считаются слишком ограничивающими ко времени появления C ++, но было бы неправильно нарушать старый код C, ослабляя правило и для встроенных модулей.
Несмотря на это, результатом вашего добавления на самом деле является lvalue, потому что это то, что вы получаете, когда возвращаете ссылку lvalue, такую как std::string&
, из функции. И это несмотря на то, что оба операнда сложения были выражениями rvalue и временными объектами. Возможно, это немного удивительно, и есть предложение сделать лучше в "распространяющейся категории значений" в таких случаях, теперь, когда язык дает нам инструменты для этого.