コンストラクターのように「見える」関数に代入できるのに、コンストラクターに代入できないのはなぜですか?
例:
struct Bar {
Bar() : b_(false) {}
Bar(bool b) : b_(b) {}
};
struct Foo {
Foo(Bar const & bar) : bar_(bar) {}
Foo operator=(Foo const & f) { return Foo(f.bar_); }
const Bar & bar_;
}
Foo bool_to_foo(bool b) { return Foo(Bar(b)); }
Foo MakeFoo(Bar const & bar) { return Foo(bar); }
なぜこれが機能するのですか:
Bar bar;
MakeFoo(bar) = bool_to_foo(true);
これがうまくいかないときは?
Bar bar;
Foo(bar) = bool_to_foo(true); // Error: 'bar': redefinition; different basic types
MakeFoo(.) と Foo(.) は同じ署名と同じ機能を持っています。
コンストラクターの特別な点は何ですか?