C++ 类栏{运算符Foo();}

C++ 类栏{运算符Foo();},c++,constructor,operator-overloading,C++,Constructor,Operator Overloading,这种类型的运算符重载意味着什么 class Foo { Foo(int a) { ... } }; class Bar { operator Foo() { return Foo(25); } }; 这是用户定义的转换函数,它隐式地将Bar的实例转换为Foo Bar bar; Foo foo = bar; // bar implicitly converts into Foo. 就好像你写了这样的话: Foo foo = Foo(25); 如果您有这样的转换函数,则可

这种类型的运算符重载意味着什么

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

class Bar {
    operator Foo() { return Foo(25); }
};

这是用户定义的转换函数,它隐式地将
Bar
的实例转换为
Foo

Bar bar;

Foo foo = bar;  // bar implicitly converts into Foo.
就好像你写了这样的话:

Foo foo = Foo(25);
如果您有这样的转换函数,则可以调用:

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

f(bar); // bar implicitly converts into Foo.
因此,这种隐式转换有时可能并不可取,因为它可能会导致问题,产生意外的结果。为了避免这种情况,可以将转换函数显式为(仅在C++11中):

现在,这两个都会产生错误:

Foo foo = bar; //error
f(bar); //error
但是,允许以下情况:

Foo foo = static_cast<Foo>(bar); //Ok
f(static_cast<Foo>(bar)); //Ok
Foo-Foo=static\u cast(条形)//好啊
f(静态_铸造(棒材))//好啊

这是
cast操作符的过载。我能找到的最好的文档是

基本上,如果你有一个
,你可以将它转换成一个
Foo
,它由一个特定的值构成:

Bar b;
Foo f = b;

C++11中引入了使用
显式
进行运算符转换?AFAIR-only构造函数在c++03中可能是显式的,或者我记不清了…@Als:你说得对。在C++03中,只有构造函数可以是显式的。我在答覆中已清楚说明这点。
Bar b;
Foo f = b;