basic_string에 대한 연역 가이드std::basic_string
From ko.cppreference.net
| 헤더 <string>
|
||
template< class InputIt, class Alloc = std::allocator<
typename std::iterator_traits<InputIt>::value_type> >
basic_string( InputIt, InputIt, Alloc = Alloc() )
-> basic_string<typename std::iterator_traits<InputIt>::value_type,
std::char_traits<
typename std::iterator_traits<InputIt>::value_type>, Alloc>;
|
에 정의됨 (1) | (C++17 이후) |
template< class CharT,
class Traits,
class Alloc = std::allocator<CharT> >
explicit basic_string( std::basic_string_view<CharT, Traits>, const Alloc& = Alloc() )
-> basic_string<CharT, Traits, Alloc>;
|
(2) | (C++17 이후) |
template< class CharT,
class Traits,
class Alloc = std::allocator<CharT>> >
basic_string( std::basic_string_view<CharT, Traits>,
typename /* see below */::size_type,
typename /* see below */::size_type,
const Alloc& = Alloc() )
-> basic_string<CharT, Traits, Alloc>;
|
(3) | (C++17 이후) |
template< ranges::input_range R,
class Alloc = std::allocator<ranges::range_value_t<R>> >
basic_string( std::from_range_t, R&&, Alloc = Alloc() )
-> basic_string<ranges::range_value_t<R>,
std::char_traits<ranges::range_value_t<R>>, Alloc>;
|
(4) | (C++23 이후) |
1) 연역 가이드는 반복자 범위로부터의 연역을 허용하기 위해 std::basic_string에 대해 제공됩니다. 이 오버로드는 오직
InputIt이 LegacyInputIterator를 만족하고 Alloc이 Allocator를 만족하는 경우에만 오버로드 해결에 참여합니다.2,3) 이러한 연역 가이드는 std::basic_string에 대해 std::basic_string_view로부터의 연역을 허용하기 위해 제공됩니다.
size_type(3)의 매개변수 유형은 연역 가이드에 의해 연역된 유형의 size_type 멤버 유형을 가리킵니다. 이 오버로드는 오직 Alloc이 Allocator를 만족하는 경우에만 오버로드 해결에 참여합니다.참고: 라이브러리가 유형이 LegacyInputIterator를 만족하지 않는다고 판단하는 범위는 명세되지 않습니다. 단, 최소한 정수 계열 유형은 입력 반복자로 간주되지 않습니다. 마찬가지로, 유형이 Allocator를 만족하지 않는다고 판단하는 범위도 명세되지 않습니다. 단, 최소한 멤버 유형 Alloc::value_type이 존재해야 하며 표현식 std::declval<Alloc&>().allocate(std::size_t{})은 평가되지 않은 피연산자로 처리될 때 적합하게 구성되어야 합니다.
참고 사항
가이드 ( 2,3 ) 가 필요한 이유는 std::basic_string 의 std::basic_string_view 생성자들이 기존 코드에서 모호함을 유발하지 않도록 템플릿으로 구현되었으며, 이러한 템플릿들은 클래스 템플릿 인수 추론을 지원하지 않기 때문입니다.
참고 사항
| 기능 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | 범위 인식 생성 및 삽입; 오버로드 ( 4 ) |
예제
이 코드 실행
#include <cassert> #include <string> #include <vector> int main() { std::vector<char> v = {'a', 'b', 'c'}; std::basic_string s1(v.begin(), v.end()); // deduction guide (1) 사용 assert(s1 == "abc"); #if __cpp_lib_containers_ranges >= 202202L std::vector<wchar_t> v4{0x43, 43, 053, 0x32, 0x33}; std::basic_string s4(std::from_range, v4); // deduction guide (4) 사용 assert(s4 == L"C++23"); #endif }
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| LWG 3075 | C++17 |
basic_string_view
에서의 추론이 지원되지 않음
( LWG 이슈 2946 에 의해 악화됨) |
추론 가이드가 추가됨 |