Улучшает ли безопасность маркировку операторов присваивания только для lvalue?
ЕслиT
это тип класса с подписью по умолчанию для оператора присваивания, тогда мы можем написать:
T const &ref = ( T{} = something );
который создает висячую ссылку. Однако с подписью:
T &operator=(T t) &
приведенный выше код со свисающей ссылкой не удастся скомпилировать. Это предотвратит некоторые ситуации, когда мы возвращаем lvalue, который обозначает временный объект - нежелательные ситуации, потому что они могут привести к висящим ссылкам.
Есть ли причина не делать этого; Будем ли мы отключать любые допустимые варианты использования для операторов присваивания?
Я думаю, что те же комментарии могут относиться и к составным операторам присваивания,+=
и т.д. Более реалистичным случаем может быть:
std::string const &s = std::string("Hello, ") += "world!";
где опечатка останется незамеченной до времени выполнения UB.