ref-квалификаторы для оператора присваивания стандартных типов библиотек - PullRequest
0 голосов
/ 26 октября 2018

Мне было интересно, есть ли причина, по которой оператор присваивания стандартных типов не является lvalue ref-qualified? Ни один из них.

Из-за этого мы можем написать такие вещи:

std::string{} = "42";
std::string s = "hello " + std::string{"world"} = "oops!";

std::vector<int> v = { 1,2,3 };
std::move(v) = { 4,5,6 };

Если бы оператор присваивания был квалифицирован как lvalue, все эти примеры не скомпилировались бы.

Это из-за того, что есть много вещей, которые нужно изменить (но тогда так было просто так), и никто не написал предложение для? Я не думаю, что люди пишут такой код, но разве библиотека не должна быть спроектирована так, чтобы она даже не позволяла этого?

1 Ответ

0 голосов
/ 26 октября 2018

Ваше предложение было предложено в 2009 году и в конечном итоге отклонено во Франкфурте в этом году из-за "опасений по поводу обратной совместимости" .

Это было бы серьезным изменениеми нам это не нравится.

Существующий запрет на присваивание r-значений встроенных типов в любом случае имеет ограниченную реальную ценность, поэтому стоимость возможного взлома существующего кода почти наверняка считаласьбыть "не стоящим" .

Была бы библиотека разработана таким образом, если бы у нас был чистый лист?Возможно.

...