Пространства имён
Варианты
Действия

std::operator+(std::basic_string)

Материал из cppreference.com
< cpp‎ | string‎ | basic string
 
 
 
std::basic_string
Функции-элементы
Доступ к элементам
Итераторы
Ёмкость
Операции
Поиск
Константы
Правила вывода(C++17)
Функции, не являющиеся элементами
operator+
Ввод/Вывод
Сравнение
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
Числовые преобразования
(C++11)(C++11)(C++11)
(C++11)(C++11)
(C++11)(C++11)(C++11)
(C++11)
(C++11)
Вспомогательные классы
 
Определено в заголовочном файле <string>
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(conststd::basic_string<CharT,Traits,Alloc>& lhs,

                   conststd::basic_string<CharT,Traits,Alloc>& rhs );
(1)(constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(conststd::basic_string<CharT,Traits,Alloc>& lhs,

                   const CharT* rhs );
(2) (constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(conststd::basic_string<CharT,Traits,Alloc>& lhs,

                   CharT rhs );
(3) (constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(const CharT* lhs,

                   conststd::basic_string<CharT,Traits,Alloc>& rhs );
(4) (constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+( CharT lhs,

                   conststd::basic_string<CharT,Traits,Alloc>& rhs );
(5) (constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(std::basic_string<CharT,Traits,Alloc>&& lhs,

                   std::basic_string<CharT,Traits,Alloc>&& rhs );
(6)(начиная с C++11)
(constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(std::basic_string<CharT,Traits,Alloc>&& lhs,

                   conststd::basic_string<CharT,Traits,Alloc>& rhs );
(7) (начиная с C++11)
(constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(std::basic_string<CharT,Traits,Alloc>&& lhs,

                   const CharT* rhs );
(8) (начиная с C++11)
(constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(std::basic_string<CharT,Traits,Alloc>&& lhs,

                   CharT rhs );
(9) (начиная с C++11)
(constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(conststd::basic_string<CharT,Traits,Alloc>& lhs,

                   std::basic_string<CharT,Traits,Alloc>&& rhs );
(10) (начиная с C++11)
(constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+(const CharT* lhs,

                   std::basic_string<CharT,Traits,Alloc>&& rhs );
(11) (начиная с C++11)
(constexpr since C++20)
template<class CharT, class Traits, class Alloc >

    std::basic_string<CharT,Traits,Alloc>
        operator+( CharT lhs,

                   std::basic_string<CharT,Traits,Alloc>&& rhs );
(12) (начиная с C++11)
(constexpr since C++20)

Возвращает строку, содержащую символы из lhs, за которыми следуют символы из rhs.

Аллокатор, используемый для результата:

1-3)std::allocator_traits<Alloc>::select_on_container_copy_construction(lhs.get_allocator())
4,5)std::allocator_traits<Alloc>::select_on_container_copy_construction(rhs.get_allocator())
6-9)lhs.get_allocator()
10-12)rhs.get_allocator()

Другими словами, если один операнд является basic_string rvalue, используется его аллокатор; иначе select_on_container_copy_construction используется в аллокаторе операнда lvalue basic_string. В каждом случае левый операнд является предпочтительным, если оба являются basic_string одной и той же категории значений.

Для (6-12) все операнды rvalue basic_string остаются в допустимых, но неуказанных состояниях.

(начиная с C++11)

Содержание

[править]Параметры

lhs строка, символ или указатель на первый символ в массиве с нулевым завершением
rhs строка, символ или указатель на первый символ в массиве с нулевым завершением

[править]Возвращаемое значение

Строка, содержащая символы из lhs, за которыми следуют символы из rhs, с использованием аллокатора, определённого, как указано выше(начиная с C++11).

Примечание

operator+ следует использовать с большой осторожностью, когда задействованы аллокаторы с отслеживанием состояния (например, когда используется std::pmr::string)(начиная с C++17). До P1165R1 аллокатор, используемый для результата, определялся случайно и мог меняться от перегрузки к перегрузке без видимой причины. Более того, для (1-5) поведение распространения аллокатора варьируется в зависимости от основных реализаций стандартной библиотеки и отличается от поведения, описанного в стандарте.

Поскольку аллокатор, используемый результатом operator+, чувствителен к категории значения, operator+ не является ассоциативным относительно распространения аллокатора:

using my_string =std::basic_string<char, std::char_traits<char>, my_allocator<char>>; my_string cat();const my_string& dog();   my_string meow =/* ... */, woof =/* ... */; meow + cat()+/* ... */;// использует select_on_container_copy_construction в аллокаторе meow woof + dog()+/* ... */;// вместо этого использует аллокатор возвращаемого значения dog()   meow + woof + meow;// использует select_on_container_copy_construction в аллокаторе meow meow +(woof + meow);// вместо этого использует SOCCC в аллокаторе woof

Для цепочки вызовов operator+ аллокатором, используемым для конечного результата, можно управлять, добавляя к rvalue basic_string желаемый распределитель:

// используется my_favorite_allocator для получения окончательного результата my_string(my_favorite_allocator)+ meow + woof + cat()+ dog();

Для лучшего и переносимого управления аллокаторами такие функции-элементы, как append, insert и operator+=, следует использовать в результирующей строке, созданной с помощью желаемого аллокатора.

(начиная с C++11)

[править]Пример

#include <iostream>#include <string>   int main(){std::string s1 ="Привет";std::string s2 ="мир";std::cout<< s1 +' '+ s2 +"!\n";}

Вывод:

Привет мир!

[править]Отчёты о дефектах

Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:

Номер Применён Поведение в стандарте Корректное поведение
WG не указан C++11 распространение аллокатора является случайным и непоследовательным стало более последовательным

[править]Смотрите также

добавляет символы в конец
(public функция-элемент)[править]
добавляет символы в конец
(public функция-элемент)[править]
вставляет символы
(public функция-элемент)[править]
close