【发布时间】:2014-01-07 19:34:28
【问题描述】:
在 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 表达式中不能定义类型的规则在哪里?
【问题讨论】:
-
大概对于
sizeof来说,至少这可以从5.3/1中指定的Unary expressions语法推断出来,但粗略看下并不明显(由于递归定义)。 -
+1,好问题。但是阅读关于这个特定主题的标准是相当令人迷惑的,到处都是参考。顺便说一句,你能举一个你真正需要这些东西的例子吗? IOW,是否总是可以将定义分成两部分?
-
@MarkB:
sizeof(type-id)->type-id->type-specifer-seq->type-specifier->class-specifier。附录A是一个语法总结。从语法上讲,它是允许的,所以在某处必须有一些文字说明您不能在那里定义类型。 -
啊,如果只有 Clang 4.X 会在编译器错误中显示标准引用 ;-)
-
@TemplateRex:实际上这不是一个坏主意。不过,做匹配需要做很多工作。
标签: c++ c++11 language-lawyer specifier type-declaration