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

例:

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

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

最佳答案

这行:

Foo(bar) = bool_to_foo(true);

不按照您的想法去做。它没有声明使用bar初始化的临时对象。
它实际上所做的是声明一个类型为bar的名为Foo的对象,并使用值bool_to_foo(true)对其进行初始化。

从这个意义上讲,它完全等同于:
Foo bar = bool_to_foo(true);

由于在作用域中已经有一个名为bar的对象,因此需要重新定义。

如果您仍然想做您想做的事情,可以尝试:
Foo((0,bar)) = bool_to_foo(true);

但是,由于这既丑陋又令人困惑,因此我将不作进一步描述。

关于c++ - 分配给构造函数? (像元组层),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14711588/

10-11 15:36
查看更多