프로그래밍 언어/C++

C ++ 11에서 'typedef'와 'using'의 차이점

Rateye 2021. 7. 13. 10:28
728x90
반응형

 

질문 : C ++ 11에서 'typedef'와 'using'의 차이점은 무엇입니까?

typedef 와 같은 형식 별칭을 작성 using 을 사용할 수 있다는 것을 알고 있습니다.

typedef int MyInt;

내가 이해하는 바에 따르면 다음과 같습니다.

using MyInt = int;

그리고 그 새로운 구문은 "템플릿 typedef"를 표현하는 방법을 가지려는 노력에서 나왔습니다.

template< class T > using MyType = AnotherType< T, MyAllocatorType >;

그러나 처음 두 개의 템플릿이 아닌 예제의 경우 표준에 다른 미묘한 차이가 있습니까? 예를 들어 typedef 는 "약한"방식으로 앨리어싱을 수행합니다. 즉, 새 유형을 생성하지 않고 새 이름 만 생성합니다 (해당 이름간에 변환이 암시적임).

using 과 동일합니까 아니면 새로운 유형을 생성합니까? 차이점이 있습니까?

답변

아래의 모든 표준 참조는 N4659 : 2017 년 3 월 코나 이후 작업 초안 / C ++ 17 DIS를 참조 합니다.

그러나 처음 두 개의 템플릿이 아닌 예제의 경우 표준에 다른 미묘한 차이가 있습니까?

  • 의미의 차이 : 없음.
  • 허용 된 컨텍스트의 차이 : some (1) .

(1) 원본 게시물에서 이미 언급 한 별칭 템플릿의 예 외에도.

[dcl.typedef] / 2 [추출, 내 강조 ]에 의해 관리 됨

[dcl.typedef] / 2 typedef-name 은 alias-declaration으로 도 도입 될 수 있습니다. 다음과 같은 식별자 using 키워드는 형식 정의 이름과형식 정의 이름에 식별자 appertains 다음 선택 속성 지정자-SEQ된다. 이러한 typedef-name typedef 지정자에 의해 도입 된 것과 동일한 의미를 갖습니다. [...]

alias-declaration에 의해 도입 된 typedef-name typedef 선언에 의해 도입 된 것과 동일한 의미 를 갖습니다.

그러나 이것은 두 변형이 사용될 수있는 컨텍스트 와 관련하여 동일한 제한이 있음을 의미하지는 않습니다. 그리고 실제로는 모퉁이의 경우에도 typedef 선언init-statement 이므로 초기화 문을 허용하는 컨텍스트에서 사용할 수 있습니다.

// C++11 (C++03) (init. statement in for loop iteration statements).
for(typedef int Foo; Foo{} != 0;) {}

// C++17 (if and switch initialization statements).
if (typedef int Foo; true) { (void)Foo{}; }
//  ^^^^^^^^^^^^^^^ init-statement

switch(typedef int Foo; 0) { case 0: (void)Foo{}; }
//     ^^^^^^^^^^^^^^^ init-statement

// C++20 (range-based for loop initialization statements).
std::vector<int> v{1, 2, 3};
for(typedef int Foo; Foo f : v) { (void)f; }
//  ^^^^^^^^^^^^^^^ init-statement

for(typedef struct { int x; int y;} P;
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ init-statement
    auto [x, y] : {P{1, 1}, {1, 2}, {3, 5}}) { (void)x; (void)y; }
    

반면 앨리어스 선언init-문이 아닌, 따라서 초기화 문을 허용하는 상황에서 사용할 수 없습니다

// C++ 11.
    for(using Foo = int; Foo{} != 0;) {}
    //  ^^^^^^^^^^^^^^^ error: expected expression
    
    // C++17 (initialization expressions in switch and if statements).
    if (using Foo = int; true) { (void)Foo{}; }
    //  ^^^^^^^^^^^^^^^ error: expected expression
    
    switch(using Foo = int; 0) { case 0: (void)Foo{}; }
    //     ^^^^^^^^^^^^^^^ error: expected expression
    
    // C++20 (range-based for loop initialization statements).
    std::vector<int> v{1, 2, 3};
    for(using Foo = int; Foo f : v) { (void)f; }
    //  ^^^^^^^^^^^^^^^ error: expected expression
    
출처 : https://stackoverflow.com/questions/10747810/what-is-the-difference-between-typedef-and-using-in-c11
728x90
반응형