[英]Elaborated type specifier in type alias
為什么下面的代碼沒有硬錯誤? 類型別名和類名完全相同(編譯器clang
):
using S = struct S;
struct S {};
S s;
int main()
{
}
以下代碼(符號或類型別名)中變量定義中確切使用的名稱是哪個?
using S = struct S {};
int main()
{
S s;
}
第一個是 C 的保留,其中標記命名空間(結構/聯合/枚舉)與類型命名空間(typedef 和內置類型)完全分開。
在 C++ 中,該規則很寬松,因此如果 typename-namespace 中沒有任何內容,則會自動搜索 tag-namespace。
第二個是通過考慮第一個的答案來回答的:
找到類型名。
下面的代碼使S
成為名為S
的結構體的別名。 在using S
重新定義了名稱S
作為一個別名struct S
。
using S = struct S;
下面的行定義了struct S
。
struct S {};
下面的聲明,使用S
其作為別名S
通過使用制備。
S s;
至少可以說,這類似於
using K = struct S;
struct S { S(){ std::cout << "Constructed!\n"; } };
K s;
int main()
{ }
代碼將打印:
Constructed!
基本上,名稱K
將被struct S
替換。
對於您的第二個示例,它本質上與 C 的typedef
相同:
typedef struct C {} C;
這在 C++ 中是多余的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.