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&
int main()
{
A&
B&
C&
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&
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 |