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

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+( const std::basic_string<CharT,Traits,Alloc>& lhs,

                   const std::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+( const std::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+( const std::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,

                   const std::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,

                   const std::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,

                   const std::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+( const std::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 функция-элемент) [править]