標籤:

C++11 中 typedef 和 using 有什麼區別?


  • 定義一般類型的別名沒區別。

C++11標準7.1.3.2:( https://isocpp.org/files/papers/N3690.pdf )

2 A typedef-name can also be introduced by an alias-declaration. The identifier following the using keyword becomes a typedef-name and the optional attribute-specifier-seq following the identifier appertains to that typedef-name. It has the same semantics as if it were introduced by the typedef specifier. In particular, it does not define a new type and it shall not appear in the type-id.

[Example:

using handler_t = void (*)(int);

extern handler_t ignore;

extern void (*ignore)(int); // redeclare ignore

using cell = pair&; // ill-formed

— end example ]

  • 定義模板的別名,只能使用using

參考:C++11模板的別名


using可以using模板


可以看我這裡書寫的部分 https://zhuanlan.zhihu.com/p/21264013


如下所示,using 可以用於模板別名,typedef 不可用於模板別名。

#include &

template&
class A
{
public:
A()
{
std::cout &<&< "A " &<&< typeid(T).name() &<&< std::endl; } }; template &
using B = A&;

template &
typedef A& C;

int main()
{
A& a;
B& b; // OK, B is an alias of class A.
C& c; // Syntax Error, C cannot be recognized as a type.
return 0;
}


《Effective Modern C++》里有比較完整的解釋


using 是C++11用來擴展typedef 的, 不在typedef上擴展是為了儘可能保持C語言的兼容性。

---------------------------------------------------------------------------------------------------------------------

畢竟typedef屬於C語言的遺產,C++標準委員會在擴充的時候盡量避免未來可能的和C的不兼容(畢竟C語言有故意製造和C++不兼容的事情了),例如C語言某天打算給typedef來點什麼特色啥的


前面的大大們已經說的很清楚了,using可以用模板,而且,C++11標準鼓勵用using,也比較直觀。個人覺得typedef用法比較反人類


說個特別的用法

// type alias can introduce a member typedef name
template&
struct Container {
using value_type = T;
};
// which can be used in generic programming
template&
void fn2(const Container c)
{
typename Container::value_type n;
}
// 2016/08/25 補
int main()
{
Container& c;
fn2(c); // Container::value_type will be int in this function
return 0;
}


說個真事,同事n年c++開發經驗,c++特別溜。有一次我拿typedef和#define反過來覆過去問他,一分鐘不到他就懵圈了,根本分不清typedef和#define該怎麼用了。


推薦閱讀:

C++中如下的變數聲明見過嗎?
auto recommended = 200"000U;

C++的class與struct到底有什麼不同?
Google C++ Style Guide 中為什麼禁止使用預設函數參數?
關於C++中的下劃線?
C++ 如何自動推導遞歸 lambda 函數的類型?

TAG:C |