【发布时间】:2020-06-22 02:01:57
【问题描述】:
除了在构造函数、析构函数或转换函数的声明中,至少一个不是 cv 限定符的定义类型说明符应出现在完整的 type-specifier-seq 中或一个完整的decl-specifier-seq。
构造函数是一个例外,因为构造函数可以声明为constructor(){},此声明中没有定义类型说明符,对于析构函数也是如此。
对于conversion function,当我在上面的引用中想到defining-type-specifier 包含type-specifier 时,我不知道转换函数不需要类型说明符,因为句子定义-不是 cv-qualifier 的类型说明符意味着,只有 type-specifier 包含 cv-qualifier,因此我认为转换函数声明应至少包含一个 defining- type-specifier(在较小的范围内,它是type-specifier,它是defining-type-specifier的子集),转换函数的语法如下,由于[dcl.fct.def#general-1]:
attribute-specifier-seq(opt) decl-specifier-seq(opt) 声明符 virt-specifier-seq(opt) function-body
其中,它的声明符如下:
运算符转换类型-id
转换类型 ID
type-specifier-seq 转换声明符(opt)
但是根据[class.conv.fct],它说:
转换函数(如果有)的 decl-specifier-seq 中的 decl-specifier 既不是 defining-type-specifier 也不是静态的。
这意味着decl-specifier-seq(opt) 不能是定义类型说明符,也不能是静态的。
但是,在一个conversion-type-id的type-specifier-seq中,它必须是一个defining-type-specifier。
operator Type(){ // Type is a defining-type-specifier(more exactly,it's a type-specifier)
return Type{};
}
你不会像这样定义转换函数:
operator (){ // there's no defining-type-specifier in type-specifier-seq
//...
}
类型不应在返回或参数类型中定义。
这是因为定义类型说明符必须出现在函数声明中的限制,因为
定义类型说明符包括:
- 类型说明符
- 类说明符
- 枚举说明符
class-specifier 或 enum-specifier 不能在函数声明的 decl-specifier-seq 中使用,因为最后一个引号。只允许type-specifier。
所以,就目前而言,该标准实际上想说的是,对 type-specifier 使用 more range 措辞,即 defining -type-specifier,因为你确实可以声明像struct A{} variable;这样的变量,所以没有class-specifier包含在type-specifier中,因此,作为一般规则,标准使用涵盖此类情况的“措辞”定义类型说明符。
那么,为什么转换函数在第一条规则中是一个例外?以上分析如有误会,敬请指正。
问题:
- 为什么转换函数在第一个引号中是一个例外?
- 如果一个转换函数是异常,为什么其他函数不是?
【问题讨论】:
标签: c++ c++17 language-lawyer