typedef Some::Nested::Namespace::TypeName TypeName;
或
using Some::Nested::Namespace::TypeName;
提供在局部範圍內的速記TypeName
之間的區別是什麼?
typedef Some::Nested::Namespace::TypeName TypeName;
或
using Some::Nested::Namespace::TypeName;
提供在局部範圍內的速記TypeName
之間的區別是什麼?
typedef
給出該類型的別名。
typedef Some :: Nested :: Namespace :: TypeName TypeName;
一旦你這樣做了,只需在本地命名空間中說TypeName
就可以引用Some::Nested::Namespace::TypeName
。
using declaration
使得該類型在當前命名空間中可見。
using Some :: Nested :: Namespace :: TypeName;
在當前名稱空間中導入該類型。
在這種情況下,使用上述任意一種,只需在本地名稱空間中使用TypeName
即可引用Some::Nested::Namespace::TypeName
。
使用只是將聲明帶入本地範圍,而typedef引入typedef名稱。它們之間的一個區別是詳盡的類型說明符,例如:
namespace n
{
class foo
{
};
}
typedef n::foo n_foo;
using n::foo;
int main()
{
class foo f1; // ok, declares f1 variable of type n::foo.
class n_foo f2; // error, typedef-name can't be used in elaborated-type-specifier.
}
它們具有不同的來源和不同的用途。
typedef
來自C
:記得,在C方式來聲明一個結構是:
typedef struct _MyStruct { .... } MyStruct;
它可以讓你引入一個別名的類型只。它可以用於函數的類型,有一個尷尬的語法...
typedef void (*Func)(Foo, Bar);
哪裏Func
現在是一個指針,通過複製以兩個參數(分別爲類型Foo
和Bar
)功能,並返回什麼。
using
最初有不同的含義。它是爲了向一個範圍注入一個名字。任何名稱(幾乎)都可以注入:類型,函數,變量(但不是枚舉值...)
用C++ 11,語法已增強,以允許模板混疊:
template <typename T>
using equiv_map = std::map<T,T>;
此加電using
意味着混疊(見下文)現在是可能的,前一功能的頂。
此C++ 11更改是語法協調的明確方向。注意別名的定義如何,現在類似變量的定義:
<name> = <expression>;
不幸的是它似乎是標準保留了這個別名到模板的情況,所以現在都
typedef
和
using
並存,各有各的狩獵場。
你的意思是你的最後一段'using name = int;'在C++ 11中不是格式良好的嗎? – dyp
@DyP:這就是我的意思,雖然我不記得爲什麼,因爲它確實工作(並且對於函數引用/指針非常方便)。我不知道我是否被早期版本的gcc/clang燒燬。 –
雖然有真正的區別嗎?尤其是考慮到C++ 11'using'語句的提升,它允許定義模板別名。 –
至少模板類型有一個區別。你只能'typedef'一個專門的類型,比如'vector',並且你可以只在非專用模板上使用'using'(例如'vector') –
jalf
如果你有一堆你想要的重載操作符import,'typedef'在這種情況下不起作用,因爲你必須使用'using'! – AraK