C++11 标准中的 §12.3.2/1 似乎存在矛盾
There seems to be a contradiction in §12.3.2/1 in the C++11 Standard
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中没有"如果"的措辞。我在缺陷报告列表中也找不到它的参考。这很奇怪。
正如费尔南德斯所评论的那样,措辞很奇怪,但并不矛盾。
- C++模板来检查友元函数的存在
- 既然存在危险,为什么项目要使用-I include开关
- 我们可以访问一个不存在的联盟的成员吗
- C++:对不存在的命名空间使用命名空间指令
- C++quit()函数中可能存在作用域问题
- C++擦除(如果存在)
- g++ 说函数不存在,即使包含正确的标头
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 有了gcc,是否可以链接库,但前提是它存在
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- C++Builder中的OnClick事件签名存在问题
- 如何正确地将分支添加到已存在的树中
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 如何检查QList中是否存在值
- 根据某个函数是否存在启用模板
- 如何将分支添加到已存在的TTree:ROOT
- [lex.ccon] 中 c-char 的定义可能存在矛盾
- 关于“auto_ptr”模板类,这两个来源之间是否存在矛盾
- C++11 标准中的 §12.3.2/1 似乎存在矛盾