2

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

例子:

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

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

4

2 回答 2

8

这一行:

Foo(bar) = bool_to_foo(true);

不做你认为它做的事。它没有声明一个用 初始化的临时对象bar。它实际上所做的是声明一个名为bartype的对象Foo并使用 value 对其进行初始化bool_to_foo(true)

从这个意义上说,它完全等同于:

Foo bar = bool_to_foo(true);

由于您已经bar在范围内命名了一个对象,因此这是一个重新定义。


如果你仍然想做你想做的事情,你可以尝试:

Foo((0,bar)) = bool_to_foo(true);

但是,由于这既丑陋又令人困惑,我不会进一步描述它。

于 2013-02-05T16:07:51.057 回答
0

MakeFoo()函数返回一个对象,然后可以将其分配给(尽管我怀疑带有编译器警告的它会抱怨分配给临时对象)。但是,正如您所推测的,C++ 标准对构造函数给予特殊处理。虽然我不完全确定,但我怀疑该= bool_to_foo(true)部分被视为初始化,而不是分配。这会导致错误,因为 foo 没有复制构造函数。

Rob 的 Foo(bar) 交易也一针见血。C++ 语法有时会很奇怪。

无论如何,这两种形式中的任何一种都是不好的做法——分配给右值可能不是你想要的,如果是的话,很可能会让人们感到困惑。

于 2013-02-05T16:12:03.660 回答