[英]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.