C++11 Standard §12.3.2/1 (emphasis mine):
A member function of a class X having no parameters with a name of the form
conversion-function-id:
operator conversion-type-id
conversion-type-id:
type-specifier-seq conversion-declarator
conversion-declarator:
ptr-operator conversion-declarator
specifies a conversion from X to the type specified by the conversion-type-id. Such functions are called conversion functions. No return type can be specified. If a conversion function is a member function, the type of the conversion function (8.3.5) is “function taking no parameter returning conversion-type-id”.
Is a conversion function always a member function, or there are cases where this is not true?
The clause "If a conversion function is a member function," was added to the working draft in N2798 as part of the Concepts wording per N2773 Proposed Wording for Concepts. N2798 12.3.2/1 reads (I'll use bold to show additions, and strikeout to show removals):
1 A member function of a class
X
having no parameters, or an associated function of a concept whose sole parameter is of typeX
, with a name of the formconversion-function-id:
operator
conversion-type-idconversion-type-id:
type-specifier-seq attribute-specifieropt conversion-declaratoropt
conversion-declarator:
ptr-operator conversion-declaratoropt
specifies a conversion from
X
to the type specified by the conversion-type-id. Suchmemberfunctions are called conversion functions.Classes, enumerations, and typedef-names shall not be declared in the type-specifier-seq. Neither parameter types norNo return type can be specified. If a conversion function is a member function, tThe type ofathe conversion function (8.3.5) is “function taking no parameter returning conversion-type-id”; if a conversion function is an associated function, the type of the conversion function is “function taking a parameter of typeX
returning conversion-type-id”. A conversion function is never used to convert ...
The Concepts wording was removed in draft N2960. The "If a conversion function is a member function," should have also been removed at that time since it is now vestigal. Pertinent portion of N2960 §12.3.2/1:
1 A member function of a class
X
having no parameters,or an associated function of a concept whose sole parameter is of type X,with a name of the formconversion-function-id:
operator
conversion-type-idconversion-type-id:
type-specifier-seq attribute-specifieropt conversion-declaratoropt
conversion-declarator:
ptr-operator conversion-declaratoropt
specifies a conversion from
X
to the type specified by the conversion-type-id. Such functions are called conversion functions. No return type can be specified. If a conversion function is a member function, the type of the conversion function (8.3.5) is “function taking no parameter returning conversion-type-id”; if a conversion function is an associated function, the type of the conversion function is “function taking a parameter of type. ...X
returning conversion-type-id”
2018-02-03 Update: This has been fixed in C++17
CWG corrected this wording as a drive-by while fixing CWG issue 1990.
A conversion function is always a (non-static
) member function.
The "if" wording was not present in C++98 or C++03. I can find no reference to it in the defect reports list either. It's strange.
As R. Martinho Fernandes commented the wording is strange, but not contradictory.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With