◐ Shell
clean mode source ↗

std::operator+(std::basic_string) — cppreference.com

<tbody> </tbody>

Определено в заголовочном файле <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 распространение аллокатора является случайным и непоследовательным стало более последовательным

Смотрите также