分配给构造函数?(类似于元组层)

Assignment to a constructor? (like a tuple-tier)

本文关键字:元组 类似于 构造函数 分配      更新时间:2023-10-16

为什么我不能分配给构造函数,而我可以分配给一个"看起来"像构造函数的函数?

示例:

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初始化的临时对象。它实际做的是声明一个类型为Foo的名为bar的对象,并使用值bool_to_foo(true)对其进行初始化。

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

Foo bar = bool_to_foo(true);

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


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

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

但是,既然这既丑陋又令人困惑,我就不再赘述了。

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

Rob与Foo(酒吧)的交易也一针见血。C++语法有时可能很奇怪。

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