[英]C++11 standard ref for allowed type definitions in type specifier uses?
在C ++ 11中, 類型說明符包括類說明符和枚舉說明符 。 (又名類定義和枚舉定義)
根據語法/語法 - 類型說明符可以出現在語言的幾個地方,但不是所有那些地方都允許使用類說明符和枚舉說明符。
例如:
struct C{} c;
// ok: types may be defined in the specifiers of a simple declaration
void f(struct S{});
// error: types may not be defined in parameter types
constexpr auto i = sizeof(enum E{});
// error: types may not be defined in ‘sizeof’ expressions
標准中的哪些部分將類型說明符的這些用法划分為可以定義類型和不定義類型的那些? 例如,在sizeof表達式中可能沒有定義類型的規則在哪里?
它在C ++標准中找不到的原因是因為它實際上禁止在C標准的增量中使用。
在C.1.4中,我們有以下內容: Change: Types must be declared in declarations, not in expressions In C, a sizeof expression or cast expression may create a new type.
這顯示了有問題的禁令。
這在7.1.6 / 3中明確提到:
除非聲明構造函數,析構函數或轉換函數,否則聲明中至少需要一個不是cv-qualifier的類型說明符.92 type-specifier-seq不應定義類或枚舉,除非它出現在類型中 - 別名聲明(7.1.3)的id,它不是模板聲明的聲明。
其中特別感興趣的部分是A type-specifier-seq shall not define a class or enumeration unless...
從N3797:
8.3.5 / 9不應在返回或參數類型中定義類型。 函數定義的參數類型或返回類型不應是不完整的類類型(可能是cv限定的),除非刪除該函數(8.4.3)或定義嵌套在該類的成員規范中(包括在類中定義的嵌套類中的定義。
這會阻止在函數聲明中定義新類型。
接下來的兩個是OP未提及的其他角落案例:
11.3 / 2不應在朋友聲明中定義一個班級。
14.1 / 2類型不應在模板參數聲明中定義。
最后,這個子句在sizeof
和其他地方阻止它:
7.1.6 / 3 type-specifier-seq不應定義類或枚舉,除非它出現在別名聲明(7.1.3)的type-id中,而不是模板聲明的聲明
請注意,C沒有該限制(C.1.4)
此外,在以前版本的C ++標准中,我們有:
5.3.3p5類型不應以sizeof表達式定義
我在最新版本的標准提案中找不到它,並且在N3797下是冗余的,因為sizeof
的路由在語法中定義類型是通過type-specifier-seq
,並被7.1.6 / 3阻塞:
sizeof(type-id)
- > type-id
- > type-specifer-seq
- > type-specifier
- > class-specifier
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.