分配给构造函数?(类似于元组层)
Assignment to a constructor? (like a tuple-tier)
为什么我不能分配给构造函数,而我可以分配给一个"看起来"像构造函数的函数?
示例:
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++语法有时可能很奇怪。
在任何情况下,这两种形式中的任何一种都是不好的做法-分配给右值可能不是你想要的,如果是这样的话,很可能会让人感到困惑。
相关文章:
- std::ranges::elements_view,用于自定义类似元组的数据
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- 类似元组的类模板的反向内存布局
- C++中用于结构的纯数组的类似于TableView/DataFrame的通用功能
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 仅当元组中存在该类型时,将功能应用于元组元素
- 使用不同的整数组装字符数组以类似于日期和时间
- 如何在C 中创建类似于Python的Numpy数组的数组
- 如何将单独的数组分组在一起(类似于按一列对表进行排序)
- C# 是否有办法将双精度数组强制转换为类似于C++转换为 char* 的字符串?
- 将函数应用于元组的每个元素
- C++具有类似于 Python/NumPy 的数组操作的库
- 是否使用类似于普通静态数组的容器
- 如何将函数应用于可变参数列表并将它们猫到元组
- 类模板的内部类的类似元组的结构化绑定
- 通过访问二维数组实现双线性插值的概念类似于一维数组
- 将函数元组应用于值并返回元组
- C 中的数组中的数组类似于Python中的内部列表
- 分配给构造函数?(类似于元组层)