【问题标题】:There seems to be a contradiction in §12.3.2/1 in the C++11 StandardC++11 标准中的 §12.3.2/1 似乎存在矛盾
【发布时间】:2014-04-24 14:41:47
【问题描述】:

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

X 类的一个成员函数,没有参数,名称形式为

转换函数 ID

运营商转换类型ID

转换类型 ID

类型说明符序列 转换声明符

转换声明符

ptr-operator 转换-声明符

指定从 X 到 conversion-type-id 指定的类型的转换。此类函数称为 转换函数。不能指定返回类型。 如果转换函数是成员函数,则 转换函数(8.3.5)的类型是“不带参数返回conversion-type-id的函数”。

转换函数是否始终是成员函数,或者在某些情况下并非如此?

【问题讨论】:

  • 这并不矛盾。这是一个奇怪的措辞,但并不矛盾。
  • 奇怪的是“这种函数称为转换函数”这句话中的“转换函数”没有斜体。标准中其他地方是否有主要定义?
  • @Casey conversion function 没有其他定义(在 N3936 中),似乎这 的主要定义,因此该术语在这句话中应该是斜体。
  • @Casey 别再自言自语了——你听起来很疯狂。

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


【解决方案1】:

“如果转换函数是成员函数”条款已添加到 N2798 的工作草案中,作为 N2773 Proposed Wording for Concepts 的概念措辞的一部分。 N2798 12.3.2/1 读取(我将使用 bold 显示添加,并使用 strikeout 显示删除):

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

转换函数 ID:

operatorconversion-type-id

转换类型 ID:

类型说明符序列属性说明符opt转换声明符opt

转换声明器:

ptr-operator 转换-声明符opt

指定从Xconversion-type-id 指定的类型的转换。这样的member 函数称为转换函数。 类、枚举和typedef-names不应在type-specifier-seq中声明。既不能指定参数类型,也不能指定 No 返回类型。 如果转换函数是成员函数, tTa 转换函数(8.3.5)的类型是“函数不带参数返回转换-type-id;如果转换函数是关联函数,则转换函数的类型为“函数采用X 类型的参数返回conversion-type-id。转换函数永远不会用于转换...

在草案N2960 中删除了概念措辞。 “如果转换函数是成员函数”也应该在当时被删除,因为它现在是退化的。 N2960 §12.3.2/1 的相关部分:

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

转换函数 ID:

operatorconversion-type-id

转换类型 ID:

type-specifier-seq 属性说明符opt 转换声明符opt

转换声明器:

ptr-operator 转换-声明符opt

指定从Xconversion-type-id 指定的类型的转换。此类函数称为转换函数。不能指定返回类型。如果转换函数是成员函数,则转换函数的类型(8.3.5)为“不带参数返回conversion-type-id的函数”;如果转换函数是关联函数,则转换函数的类型为“函数采用X 类型的参数返回conversion-type-id。 ...

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

CWG 在修复 CWG issue 1990 时更正了此措辞,称其为偷渡。

【讨论】:

  • 很好的答案 (+1)。谢谢。
  • 令人印象深刻的答案。某处是否有工作草案的修订历史,可让您找到某些更改的时间?
  • @VaughnCato 我希望。我去了open-std.org/jtc1/sc22/wg21/docs/papers,并在 03 到 11 年间进行了二进制搜索,以定位更改。
  • @TemplateRex: 或 pdftotext 他们,将他们添加到 git repo,然后 git log -S 他们。
  • +1 表示二分搜索很棒。 @ninjalj git'd 索引会很棒——归咎于 C++ 标准!
【解决方案2】:

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

“如果”措辞在 C++98 或 C++03 中不存在。我在缺陷报告列表中也找不到对它的引用。很奇怪。


作为 R. Martinho Fernandes commented,措辞很奇怪,但并不矛盾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 2017-05-05
    • 2016-10-06
    • 2019-08-20
    相关资源
    最近更新 更多