Development Tip

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

yourdevel 2020. 9. 28. 10:22
반응형

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


C ++ 11에서는 이제 s using와 같은 형식 별칭을 작성 하는 사용할 수 있습니다 typedef.

typedef int MyInt;

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

using MyInt = int;

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

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

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

동일 using하거나 새로운 유형을 생성합니까? 차이점이 있습니까?


표준 (강조 내) (7.1.3.2)에서 동일합니다.

typedef-name은 별칭 선언으로도 도입 할 수 있습니다. using 키워드 다음의 식별자는 typedef-name이되고 식별자 다음의 선택적 attribute-specifier-seq는 해당 typedef-name에 속합니다. typedef 지정자에 의해 도입 된 것과 동일한 의미를 갖습니다. 특히 새로운 유형을 정의하지 않으며 type-id에 나타나지 않습니다.


하여 템플릿 내에서 사용될 때 구문 이점을 갖는다. 유형 추상화가 필요하지만 나중에 지정할 수 있도록 템플릿 매개 변수도 유지해야하는 경우. 다음과 같이 작성해야합니다.

template <typename T> struct whatever {};

template <typename T> struct rebind
{
  typedef whatever<T> type; // to make it possible to substitue the whatever in future.
};

rebind<int>::type variable;

template <typename U> struct bar { typename rebind<U>::type _var_member; }

그러나 구문을 사용 하면이 사용 사례가 단순화됩니다.

template <typename T> using my_type = whatever<T>;

my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; }

다음을 제외하고는 거의 동일합니다.

별칭 선언은 템플릿과 호환되지만 C 스타일 typedef는 그렇지 않습니다.


그들은 본질적으로 동일하지만, using제공 alias templates매우 유용하다. 내가 찾을 수있는 좋은 예는 다음과 같습니다.

namespace std {
 template<typename T> using add_const_t = typename add_const<T>::type;
}

따라서 std::add_const_t<T>대신 사용할 수 있습니다.typename std::add_const<T>::type


원본 포스터에 좋은 답변이 있다는 것을 알고 있지만 저처럼이 스레드에 걸려 넘어지는 사람에게는 여기에서 토론에 가치있는 무언가를 추가한다고 생각 하는 제안 에서 중요한 메모가 있습니다. 특히 typedef키워드가 향후 사용되지 않음으로 표시되거나 중복 / 이전 항목으로 인해 제거 될 예정입니다.

템플릿 별칭을 도입하기 위해 키워드 typedef ...를 (재) 사용하도록 제안되었습니다.

template<class T>
  typedef std::vector<T, MyAllocator<T> > Vec;

이 표기법은 유형 별칭을 도입하는 것으로 이미 알려진 키워드를 사용하는 이점이 있습니다. 그러나, 별칭이 유형을 지정하지 않고 템플릿을 지정하는 컨텍스트에서 유형 이름에 대한 별칭을 도입하는 것으로 알려진 키워드를 사용하는 데 따른 혼동이 있습니다. 유형에 대한 별명 Vec아니므 로 typedef-name에 사용해서는 안됩니다. 이름 Vec은 계열의 이름입니다. std::vector<•, MyAllocator<•> >여기서 글 머리 기호는 유형 이름 의 자리 표시 자입니다. 따라서 "typedef"구문을 제안하지 않습니다. 반면에 문장은

template<class T>
  using Vec = std::vector<T, MyAllocator<T> >;

읽기 /로 해석 될 수있다 : 지금부터, 내가 사용됩니다 Vec<T>동의어로std::vector<T, MyAllocator<T> > . 그 결과 앨리어싱에 대한 새로운 구문은 합리적으로 논리적으로 보입니다.

To me, this implies continued support for the typedef keyword in C++ because it can still make code more readable and understandable.

Updating the using keyword was specifically for templates, and (as was pointed out in the accepted answer) when you are working with non-templates using and typedef are mechanically identical, so the choice is totally up to the programmer on the grounds of readability and communication of intent.

참고URL : https://stackoverflow.com/questions/10747810/what-is-the-difference-between-typedef-and-using-in-c11

반응형