почему это уже не работает?
Я могу только догадываться о том, почему он был изначально разработан таким образом. Возможно, дизайнеры струнной библиотеки просто не думали об этом; возможно, они думали, что дополнительное преобразование типов (см. ниже) может сделать поведение слишком неожиданным в некоторых ситуациях. Это одна из старейших библиотек C ++, и много мудрости, которую мы считаем само собой разумеющимся, просто не существовало в последние десятилетия.
Относительно того, почему он не был изменен для такой работы: он может сломать существующий код, добавив дополнительное преобразование пользовательских типов. Неявные преобразования могут включать не более одного пользовательского преобразования. Это указано в C ++ 11, 13.3.3.1.2 / 1:
Пользовательская последовательность преобразования состоит из начальной стандартной последовательности преобразования, за которой следует пользовательского преобразования , за которой следует вторая стандартная последовательность преобразования.
Примите во внимание следующее:
struct thingy {
thingy(std::string);
};
void f(thingy);
f(some_string + another_string);
Этот код подходит, если тип some_string + another_string
равен std::string
. Это может быть неявно преобразовано в thingy
через конструктор преобразования. Однако, если бы мы изменили определение operator+
, чтобы дать другой тип, тогда потребовалось бы два преобразования (string_helper
в string
в thingy
), и поэтому компиляция не состоялась бы.
Итак, если важна скорость построения строк, вам нужно использовать альтернативные методы, такие как конкатенация с +=
. Или, согласно ответу Матье, не беспокойтесь об этом, потому что C ++ 11 исправляет неэффективность другим способом.