class Bar {operator Foo(); }

cac*_*hed 2 c++ constructor operator-overloading

这种运算符重载的含义是什么意思?

class Foo {
    Foo(int a) { ... }
};

class Bar {
    operator Foo() { return Foo(25); }
};
Run Code Online (Sandbox Code Playgroud)

Naw*_*waz 10

这是用户定义的转换函数,它将一个实例转换BarFoo隐式.

Bar bar;

Foo foo = bar;  // bar implicitly converts into Foo.
Run Code Online (Sandbox Code Playgroud)

好像你写的那样:

Foo foo = Foo(25);
Run Code Online (Sandbox Code Playgroud)

如果你有这样的转换功能,那么你可以这样称呼:

void f(Foo foo); //a function which accepts Foo

f(bar); // bar implicitly converts into Foo.
Run Code Online (Sandbox Code Playgroud)

所以这种隐式转换有时可能不合适,因为它可能会导致问题,从而产生意想不到的结果.为避免这种情况,您可以将转换函数显式化为(仅在C++ 11中):

//valid in C++11 only

class Bar {
  explicit  operator Foo() { return Foo(25); }
};
Run Code Online (Sandbox Code Playgroud)

现在这两个都会给出错误:

Foo foo = bar; //error
f(bar); //error
Run Code Online (Sandbox Code Playgroud)

但是,允许以下内容:

Foo foo = static_cast<Foo>(bar); //Ok
f(static_cast<Foo>(bar)); //Ok
Run Code Online (Sandbox Code Playgroud)

  • 快速的手指你有:) (3认同)