C++11标准§12.3.2/1(强调矿):
X类的一个成员函数,没有具有形式名称的参数
转换函数id:
操作员转换类型id
转换类型id:
类型说明符seq转换声明符
转换声明符:
ptr运算符转换声明符
指定从X到转换类型id指定的类型的转换。这些函数称为转换函数。无法指定返回类型如果转换函数是成员函数,则转换函数(8.3.5)的类型是"不带参数的函数返回转换类型id"。
转换函数总是成员函数吗?或者在某些情况下这不是真的?
条款"如果转换函数是成员函数"在N2798中被添加到工作草案中,作为N2773概念拟议措辞的概念措辞的一部分。N2798 12.3.2/1读取(我将使用bold显示添加,使用三振显示删除):
1
X
类的一个没有参数的成员函数,或唯一参数为类型X
的概念的关联函数,具有形式的名称转换函数id:
operator
转换类型id转换类型id:
类型说明符seq属性说明符opt转换声明符opt
转换声明符:
ptr运算符转换声明符opt
指定从
X
到转换类型id指定的类型的转换。这样的成员函数称为转换函数类、枚举和typedef名称不应在类型说明符seq中声明。既不能指定参数类型,也不能指定否返回类型如果转换函数是成员函数,tt类型>转换函数(8.3.5)是"不带参数的函数返回转换类型id";如果转换函数是关联函数,则转换函数的类型为"采用X
类型参数的函数,返回转换类型id"。转换函数从不用于转换。。。
N2960草案中删除了概念措辞。"If a conversion function is a member function,"(如果转换函数是成员函数)当时也应该被删除,因为它现在已经过时了。N2960§12.3.2/1:的相关部分
1
X
类的一个成员函数,没有参数,或一个概念的相关函数,其唯一参数为类型X,,名称为转换函数id:
operator
转换类型id转换类型id:
类型说明符seq属性说明符转换声明符
转换声明符:
ptr运算符转换声明符opt
指定从
X
到转换类型id指定的类型的转换。这种函数称为转换函数。无法指定返回类型。如果转换函数是成员函数,则转换函数的类型(8.3.5)为"不带参数的函数返回转换类型id";如果转换函数是关联函数,则转换函数的类型为"采用。。。X
类型参数的函数,返回转换类型id"
2018-02-03更新:这已在C++17中修复
CWG在修正1990年CWG问题时,将这一措辞作为一种权宜之计加以纠正。
转换函数始终是(非static
)成员函数。
C++98或C++03中没有"如果"的措辞。我在缺陷报告列表中也找不到它的参考。这很奇怪。
正如费尔南德斯所评论的那样,措辞很奇怪,但并不矛盾。