C++ 11标准中的§12.3.2/ 1似乎存在矛盾

Wal*_*ldB 32 c++ language-lawyer c++11

C++ 11标准§12.3.2/ 1(强调我的):

成员函数具有以下形式的名称没有参数的类X的

conversion-function-id:

operator convert-type-id

conversion-type-id:

type-specifier-seq conversion-declarator

转换声明者:

ptr-operator转换声明器

指定从X到convert-type-id指定的类型的转换.这些功能称为转换功能.不能指定返回类型.如果转换函数是成员函数,则转换函数的类型(8.3.5)是"不返回convert-type-id的参数的函数".

转换函数是否始终是成员函数,或者有些情况不是这样?

Cas*_*sey 47

如果转换函数是成员函数,则将条款添加到N2798中的工作草案中,作为概念措辞的一部分,符合N2773概念的建议措辞.N2798 12.3.2/1读取(我将使用粗体显示添加,并使用删除线显示删除):

1 X 没有参数X的类的成员函数,或者其唯一参数是类型的概念的关联函数,具有表单的名称

转换功能ID:

operator 转换型-ID

转换型-ID:

type-specifier-seq 属性说明符opt conversion-declarator opt

转换说明符:

ptr-operator conversion-declarator opt

指定转换Xconvert-type-id指定的类型.这些成员函数称为转换函数.不应在type-specifier-seq中声明类,枚举和typedef-names.既 不能指定参数类型也不能指定返回类型.如果转换函数是一个成员函数,叔Ť他类型的一个 所述转换函数(8.3.5)为"函数不采取任何参数返回转换型-ID " ; 如果转换函数是关联函数,则转换函数的类型是"函数采用X返回转换类型id的类型的参数".转换函数永远不会用于转换...

N2960草案中删除了概念措辞."如果转换函数是成员函数",那么当时也应该被删除,因为它现在已经被删除了.N2960§12.3.2/ 1的相关部分:

1X没有参数的类的成员函数,或者唯一参数是X类型的概念的关联函数,带有表单的名称

转换功能ID:

operator 转换型-ID

转换型-ID:

type-specifier-seq属性说明符opt conversion-declarator opt

转换说明符:

ptr-operator conversion-declarator opt

指定转换Xconvert-type-id指定的类型.这些功能称为转换功能.不能指定返回类型.如果转换函数是成员函数,则转换函数的类型(8.3.5)是"不返回convert-type-id的参数的函数" ; 如果转换函数是关联函数,则转换函数的类型是"函数采用X返回转换类型id的类型的参数"....

2018-02-03更新:这已在C++ 17中修复

在确定1990年CWG问题时, CWG将此措辞更正为一个驱动器.

  • 印象深刻的回答.是否有工作草案的修订历史可以让您找到某些更改的时间? (4认同)
  • @VaughnCato我希望.我去了http://www.open-std.org/jtc1/sc22/wg21/docs/papers/,并在03和11之间进行了二元搜索,以对这些变化进行本地化. (4认同)
  • @TemplateRex:或`pdftotext`,将它们添加到git repo中,并将它们添加到`git log -S`中. (2认同)
  • @ninjalj已经有一个GitHub回购在https://github.com/cplusplus/draft (2认同)

Che*_*Alf 6

转换函数始终是(非static)成员函数.

C++ 98或C++ 03中没有"if"措辞.我也无法在缺陷报告列表中找到它.真奇怪.


正如R. Martinho Fernandes所评论的那样,措辞很奇怪,但并不矛盾.