C ++ 11标准§12.3.2/ 1(强调我的):
类X的成员函数,没有带有表单名称的参数
conversion-function-id :
operator conversion-type-id
conversion-type-id :
type-specifier-seq conversion-declarator
conversion-declarator :
ptr-operator conversion-declarator
指定从X到 conversion-type-id 指定的类型的转换。这些功能被称为 转换功能。不能指定返回类型。 如果转化功能是会员功能,则 转换函数的类型(8.3.5)是“没有参数返回的函数 conversion-type-id ”。
转换函数是否始终是成员函数,或者有些情况不属实?
答案 0 :(得分:47)
根据N2798的概念措辞,N2773 Proposed Wording for Concepts中的工作草案中添加了“如果转换函数是成员函数”这一条款。 N2798 12.3.2 / 1读取(我将使用粗体显示添加,删除显示删除):
1 没有参数的类
X
的成员函数,或者唯一参数类型为X
的概念的关联函数,使用表单名称转换功能-ID:
operator
conversion-type-id转换型-ID:
type-specifier-seq 属性说明符 opt conversion-declarator opt
转换声明符:
ptr-operator conversion-declarator opt
指定从
X
到 conversion-type-id 指定的类型的转换。这种成员函数称为转换函数。类,枚举和 typedef-names 不得在 type-specifier-seq 中声明。既不能指定参数类型也不能指定否返回类型。 如果转换函数是成员函数, tT他的类型a转换函数(8.3.5)是“没有参数返回转换的函数型-ID ”的;如果转换函数是关联函数,则转换函数的类型是“函数采用X
类型的参数返回 conversion-type-id ”。转换函数永远不会用于转换...
概念措辞已在草案N2960中删除。 “如果转换函数是成员函数”,那么当时也应该被删除,因为它现在已经被删除了。 N2960§12.3.2/ 1的相关部分:
1 类
X
的成员函数没有参数,或概念的关联函数,其唯一参数是X类型,表格的名称转换功能-ID:
operator
conversion-type-id转换型-ID:
type-specifier-seq attribute-specifier opt conversion-declarator opt
转换声明符:
ptr-operator conversion-declarator opt
指定从
X
到 conversion-type-id 指定的类型的转换。这些功能称为转换功能。不能指定返回类型。如果转换函数是成员函数,则转换函数的类型(8.3.5)是“不返回参数的函数 conversion-type-id ”;如果转换函数是关联函数,则转换函数的类型是“函数采用。 ...X
类型的参数返回 conversion-type-id ”
2018-02-03更新:这已在C ++ 17中修复
CWG在修复CWG issue 1990时将此措辞更正为驾照。
答案 1 :(得分:6)
转换函数始终是(非static
)成员函数。
" if" C ++ 98或C ++ 03中没有措辞。我也无法在缺陷报告列表中找到它。这很奇怪。
正如R. Martinho Fernandes commented所说,措辞很奇怪,但并不矛盾。