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

时间:2014-04-24 14:41:47

标签: c++ c++11 language-lawyer

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 ”。

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

2 个答案:

答案 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 中声明。既不能指定参数类型也不能指定 返回类型。 如果转换函数是成员函数,   t T 他的类型 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所说,措辞很奇怪,但并不矛盾。