Namespaces
Variants

deduction guides for std::basic_string

From cppreference.net
std::basic_string
헤더 파일에 정의됨 <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 /* 아래 참조 */ :: size_type ,
typename /* 아래 참조 */ :: 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) deduction guide std::basic_string 에 대해 제공되어 반복자 범위로부터의 deduction을 허용합니다. 이 오버로드는 InputIt LegacyInputIterator 를 만족하고 Alloc Allocator 를 만족할 때만 오버로드 해결에 참여합니다.
2,3) 이 deduction guide들은 std::basic_string 에서 std::basic_string_view 로부터의 deduction을 허용하기 위해 제공됩니다. 이 오버로드들은 Alloc Allocator 요구 사항을 만족할 때만 오버로드 해결에 참여합니다.
3) size_type 매개변수 타입은 추론 가이드에 의해 추론된 타입의 중첩 타입 size_type 을 참조합니다.
4) 이 연역 가이드는 std::basic_string 에 대한 것으로, std::from_range_t 태그와 input_range 로부터의 연역을 허용하기 위해 제공됩니다.

참고: 라이브러리가 특정 타입이 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 에 의해 악화됨)
추론 가이드가 추가됨