分配给构造函数? (像一个元组层)

时间:2013-02-05 15:58:33

标签: c++ constructor assignment-operator

为什么我不能分配给构造函数,何时可以分配给“看起来”像构造函数的函数?

示例:

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(。)具有相同的签名和相同的功能。

构造函数有什么特别之处?

2 个答案:

答案 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没有复制构造函数。

Rob还以Foo(酒吧)交易击中头部。 C ++语法有时会很奇怪。

在任何情况下,这些形式中的任何一种都是不好的做法 - 分配给rvalues 可能不是你想要的,如果是的话,很可能会让人感到困惑。