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

There seems to be a contradiction in §12.3.2/1 in the C++11 Standard

本文关键字:矛盾 存在 标准 C++11      更新时间:2023-10-16

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显示添加,使用三振显示删除):

1X类的一个没有参数的成员函数,或唯一参数为类型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:的相关部分

1X类的一个成员函数,没有参数,或一个概念的相关函数,其唯一参数为类型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中没有"如果"的措辞。我在缺陷报告列表中也找不到它的参考。这很奇怪。


正如费尔南德斯所评论的那样,措辞很奇怪,但并不矛盾。