为什么我不能分配给构造函数,何时可以分配给“看起来”像构造函数的函数?
示例:
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(。)具有相同的签名和相同的功能。
构造函数有什么特别之处?
答案 0 :(得分:8)
这一行:
Foo(bar) = bool_to_foo(true);
不符合您的想法。它 not 声明用bar
初始化的临时对象。
它实际上做的是声明一个名为bar
的{{1}}类型的对象,并使用值Foo
对其进行初始化。
从这个意义上说,它完全等同于:
bool_to_foo(true)
由于您已在范围内有一个名为Foo bar = bool_to_foo(true);
的对象,因此这是一个重新定义。
<小时/> 如果你仍想做你想做的事,你可以尝试:
bar
但是,既然这既丑陋又令人困惑,我将不再进一步描述。
答案 1 :(得分:0)
MakeFoo()
函数返回一个对象,然后可以将其分配给(虽然我怀疑它上面有编译器警告会抱怨分配给一个临时的)。但是,正如您所推测的那样,C ++标准为构造函数提供了特殊处理。虽然我不完全确定,但我怀疑= bool_to_foo(true)
部分被视为初始化,而不是作为赋值。这会导致错误,因为foo没有复制构造函数。
在任何情况下,这些形式中的任何一种都是不好的做法 - 分配给rvalues 可能不是你想要的,如果是的话,很可能会让人感到困惑。