Skip to content

User-defined conversion

User-defined conversion function

cppreference user-defined conversion function

Enables implicit conversion or explicit conversion from a class type to another type.

Syntax

Conversion function is declared like a non-static member function or member function template with no parameters, no explicit return type, and with the name of the form:

NOTE: 原文对syntax的区分是依据“explicit”的

Syntax explanation
1) operator conversion-type-id participates in all implicit and explicit conversions.
2) explicit operator conversion-type-id (since C++11)
participates in direct-initialization and explicit conversions only.
3) explicit ( expression ) operator conversion-type-id (since C++20)
conditionally explicit.

NOTE: 下面是注解:

注解
1)
2) Implicit conversions#Order of the conversions implicitly convertible to 段中给出了direct initialization的例子:
Note that this is different from direct initialization (T2 t(e)), where explicit constructors and conversion functions would additionally be considered.
3)

conversion-type-id is a type-id except that function and array operators [] or () are not allowed in its declarator (thus conversion to types such as pointer to array requires a type alias/typedef or an identity template: see below). Regardless of typedef, conversion-type-id cannot represent an array or a function type.

NOTE: 最后一句话其实说明的是:在C++中,是不允许:

  • conversion to array
  • conversion to function

但是conversion to pointer,能够实现:

  • conversion to pointer to array
  • conversion to pointer to function

下面是截取自原文中的例子,对上面这段话进行注解:

#include <iostream>

struct X
{

//   Error: array operator not allowed in conversion-type-id
//   operator int(*)[3]() const { return nullptr; }
    using arr_t = int[3];
    operator arr_t*() const
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        return nullptr;
    } // OK if done through typedef
//  operator arr_t () const; // Error: conversion to array not allowed in any case
};

int main()
{
    X x;

    int (*pa)[3] = x;  // OK
}
// g++ --std=c++11 test.cpp

NOTE: 上述程序的输出如下:

X::operator int (*)[3]() const

Specifier:

NOTE: 下面总结了所有可以使用的specifier:

specifier explanation 注解
explicit 前面已经说明
const
inline
virtual 这说明conversion function是可以dynamic polymorphism的,这有那些用途?
constexpr (since C++11)
consteval (since C++20)
friend friend requires a qualified name: friend A::operator B(); 如何使用?

Microsoft User-Defined Type Conversions (C++)

Conversion isn't considered for member access

stackoverflow Why user-defined conversion is not implicitly taking place on the calling object :

class A {
public:
   void func() const {}
};

class B {
public:
   // user-defined conversion operator to A
   operator A() const { return a_; }
private:
   A a_;
};
B b;
static_cast<A>(b).func(); // call func() on temporary instance of A
B b;
b.func(); // <-- error: 'class B' has no member named 'func'

A

Conversion isn't considered for member access (§5.2.5/2 [expr.ref]).

In either case, the id-expression shall name a member of the class or of one of its base classes

Here the id-expression is func()

So the compiler considers that func must be a member of B or a class that B derives from. Implicit conversion to other types that might have a func member is not considered.

Example

Example1: overload conversion operator for custom type to std::string:

来源: stackoverflow C++ overloading conversion operator for custom type to std::string

NOTE: 这个例子收录到了C++\Language-reference\Functions\Overload-resolution\Ambiguous-overload.md