C ++ 20에 대한 사용자 정의 문자열 리터럴 추가 이해

클라우스

사용자 정의 문자열 리터럴 에서 다음을 발견했습니다 .

  1. 사용자 정의 문자열 리터럴의 경우 str을 ud-suffix가없는 리터럴로 지정합니다.

a) 과부하 세트 STR 후 사용자 정의 문자 표현이 함수 호출로 처리 된 잘 형성된 템플릿 인수되는 비 형 템플릿 매개 변수 문자열 리터럴 연산자 템플릿을 포함하는 경우 operator "" X<str>(),

그것은 나에게 약간 신비스럽게 들립니다. 어떤 사람이 이것이 어떻게 사용될 수 있는지 예를 들어 줄 수 있습니까?

다음은 전혀 작동하지 않았으며 비 유형 템플릿 매개 변수가 무엇인지 파악할 MyType수 없습니다. char *도 const char *도 아닌 것 같습니다.

template < ??? >
struct MyType 
{
    const char* c;
    constexpr MyType( const char* in ): c{in}{}
};

template < MyType t > auto operator ""_y() { return t; }

int main()
{
    "Check it"_y;
}
니콜 볼 라스

이것은 표준에서 직접 복사 한 혼란스러운 표현입니다 .

[오버로드 세트]에 str올바른 형식의 템플릿 인수 인 형식이 아닌 템플릿 매개 변수가있는 리터럴 연산자 템플릿이 포함 된 경우

혼란스러운 부분은 " str잘 구성된 템플릿 인수"가 구체적으로 무엇에 적용 되는지에 대한 질문입니다 . 표준에서 구절을 직접 읽어 보면 "for which"는 "for which"라는 단어 바로 앞의 텍스트이기 때문에 "비 유형 템플릿 매개 변수"를 의미합니다. 그러나 표준에서 함수가 호출되는 방식을 살펴보면 다음과 같이 표시됩니다.

operator "" X<str>()

str연산자 에게 전달 되고 있으며 , 이는 str"비 유형 템플릿 매개 변수" 간에 암시 적 변환이 발생한다는 의미 입니다. 즉, 오버로드 된 함수 의 템플릿 매개 변수가 아니라 오버로드 된 함수 str의 유효한 "템플릿 인수"입니다 . 따라서 "대상"부분은 "비 유형 템플릿 매개 변수"가 아니라 "비 유형 템플릿 매개 변수가있는 리터럴 연산자 템플릿"을 참조해야합니다.

, 코드가 작동하도록하려면에서 템플릿 인수를 제거하는 것 이상을 수행해야합니다 MyType.

비 유형 템플릿 매개 변수 (NTTP)를 둘러싼 C ++에서 이상한 점을 발견했을 수 있습니다. 예를 들어, NTTP는 항상 사물에 대한 포인터가 될 수있었습니다. 그러나 당신은 이것을 할 수 없습니다.

template<const char *literal> void foo() {}
foo<"literal">();

표준은 포인터 NTTP가 문자열 리터럴로 초기화되는 것을 명시 적으로 금지합니다. 그리고 C ++ 20 은 이것을 변경하지 않습니다 .

따라서 포인터를 사용할 수 없습니다. 리터럴이 실제로 무엇인지 가져와야합니다 : 배열. 그러나 const char (&in)[]매개 변수로 사용하여 코드를 작동시킬 수는 없습니다 . 리터럴은 크기가 지정되지 않은 배열이 아닙니다 ( "크기가 지정되지 않은 배열"은 실제 개체 유형이 아니므로). 해당 배열 매개 변수 리터럴에 맞게 크기가 조정되어야합니다 .

, 크기 템플릿 매개 변수에서 크기를 추론 해야합니다 .

또한 다른 규칙 은 NTTP에 문자열 리터럴에 대한 포인터를 직접 또는 간접적으로 저장하는 것을 금지합니다. 따라서 NTTP에서 전체 문자열 리터럴을 나타내는 유형을 원하는 경우 해당 NTTP 유형 에는 해당 크기의 배열이 포함 되어야 합니다.

따라서 가장 간단하고 기능적인 문자열 리터럴 NTTP 는 다음과 같습니다.

template<size_t N>
struct string_literal
{
    std::array<char, N> arr_;

    constexpr string_literal(const char(&in)[N]) : arr_{}   
    {
        std::copy(in, in + N, arr_.begin());
    }
};

그리고 CTAD 덕분에 template < string_literal t > auto operator ""_y()UDL을 정의 하는 사용할 수 있습니다 .

string_literal클래스는 배열의 일부로 NUL 종결자를 명시 적으로 포함합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C에서 가능한 최대 문자열 리터럴 길이

분류에서Dev

C ++의 사용자 입력에 긴 이중 리터럴 접미사 추가

분류에서Dev

색인을 이동하기 위해 C의 문자열 리터럴에 추가 할 수 없습니다.

분류에서Dev

문자열과 16 진수 값에 대한 사용자 정의 리터럴

분류에서Dev

C ++ 문자열 클래스에 의해 정의 된 문자열 리터럴이 const char [] 유형입니까?

분류에서Dev

C로 문자열 리터럴에 문자 추가

분류에서Dev

C ++에서 shorts에 대한 사용자 정의 리터럴을 정의하는 해결 방법이 있습니까?

분류에서Dev

병치에 의한 C ++ 문자열 리터럴 연결

분류에서Dev

문자열 및 리터럴 추가 (C ++)

분류에서Dev

문자열 및 리터럴 추가 (C ++)

분류에서Dev

정규식을 사용하여 두 리터럴 문자열 사이에서 가장 높은 숫자 찾기

분류에서Dev

DISTINCT가 리터럴 문자열의 대소 문자를 변경하는 이유

분류에서Dev

sed에 대한 리터럴 문자열 이스케이프

분류에서Dev

char 배열 데이터 유형에 대해 C ++에서 추가 문자 추가

분류에서Dev

매크로에 대한 사용자 정의 리터럴 연산자

분류에서Dev

C ++ 용 netbeans에 사용자 정의 라이브러리 추가

분류에서Dev

"<<"의 추가 세트를 갖는 것보다 동일한 문자열 리터럴에 \ n 문자를 갖는 것이 더 효율적입니까?

분류에서Dev

정점에 대한 사용자 정의 이름 추가

분류에서Dev

문자열 리터럴을 사용한 어레이 초기화로 인해 두 개의 메모리 스토리지가 발생합니까?

분류에서Dev

C ++ 20에서 유형이 아닌 리터럴 매개 변수에 대한 템플릿의 부분 전문화 : clang 및 gcc가 동의하지 않음

분류에서Dev

문자열 리터럴에 대한 쉘 변수 비교의 양쪽에 접두사를 추가하는 목적은 무엇입니까?

분류에서Dev

유형이 지정된 문자열 리터럴에 접미사 적용

분류에서Dev

c에서 문자열 리터럴의 메모리 할당

분류에서Dev

변수를 확장하고이를 문자열 리터럴로 사용하고 개행을 추가하는 동안 파일의 텍스트 대체

분류에서Dev

C ++ 20의 사용자 정의 추론 가이드

분류에서Dev

ValueError : 10 진수를 사용하는 int ()에 대한 잘못된 리터럴 : ''-문자열을 정수로 변환

분류에서Dev

문자열 리터럴 풀에서 문자열 리터럴의 해시는 어떻게 계산됩니까?

분류에서Dev

$ "... {} ..."C #의 문자열 리터럴?

분류에서Dev

char에 대한 문자열 리터럴은 더 이상 사용되지 않습니다.

Related 관련 기사

  1. 1

    C에서 가능한 최대 문자열 리터럴 길이

  2. 2

    C ++의 사용자 입력에 긴 이중 리터럴 접미사 추가

  3. 3

    색인을 이동하기 위해 C의 문자열 리터럴에 추가 할 수 없습니다.

  4. 4

    문자열과 16 진수 값에 대한 사용자 정의 리터럴

  5. 5

    C ++ 문자열 클래스에 의해 정의 된 문자열 리터럴이 const char [] 유형입니까?

  6. 6

    C로 문자열 리터럴에 문자 추가

  7. 7

    C ++에서 shorts에 대한 사용자 정의 리터럴을 정의하는 해결 방법이 있습니까?

  8. 8

    병치에 의한 C ++ 문자열 리터럴 연결

  9. 9

    문자열 및 리터럴 추가 (C ++)

  10. 10

    문자열 및 리터럴 추가 (C ++)

  11. 11

    정규식을 사용하여 두 리터럴 문자열 사이에서 가장 높은 숫자 찾기

  12. 12

    DISTINCT가 리터럴 문자열의 대소 문자를 변경하는 이유

  13. 13

    sed에 대한 리터럴 문자열 이스케이프

  14. 14

    char 배열 데이터 유형에 대해 C ++에서 추가 문자 추가

  15. 15

    매크로에 대한 사용자 정의 리터럴 연산자

  16. 16

    C ++ 용 netbeans에 사용자 정의 라이브러리 추가

  17. 17

    "<<"의 추가 세트를 갖는 것보다 동일한 문자열 리터럴에 \ n 문자를 갖는 것이 더 효율적입니까?

  18. 18

    정점에 대한 사용자 정의 이름 추가

  19. 19

    문자열 리터럴을 사용한 어레이 초기화로 인해 두 개의 메모리 스토리지가 발생합니까?

  20. 20

    C ++ 20에서 유형이 아닌 리터럴 매개 변수에 대한 템플릿의 부분 전문화 : clang 및 gcc가 동의하지 않음

  21. 21

    문자열 리터럴에 대한 쉘 변수 비교의 양쪽에 접두사를 추가하는 목적은 무엇입니까?

  22. 22

    유형이 지정된 문자열 리터럴에 접미사 적용

  23. 23

    c에서 문자열 리터럴의 메모리 할당

  24. 24

    변수를 확장하고이를 문자열 리터럴로 사용하고 개행을 추가하는 동안 파일의 텍스트 대체

  25. 25

    C ++ 20의 사용자 정의 추론 가이드

  26. 26

    ValueError : 10 진수를 사용하는 int ()에 대한 잘못된 리터럴 : ''-문자열을 정수로 변환

  27. 27

    문자열 리터럴 풀에서 문자열 리터럴의 해시는 어떻게 계산됩니까?

  28. 28

    $ "... {} ..."C #의 문자열 리터럴?

  29. 29

    char에 대한 문자열 리터럴은 더 이상 사용되지 않습니다.

뜨겁다태그

보관