gpt4 book ai didi

c++ - 使用附加参数复制和移动分配

转载 作者:行者123 更新时间:2023-12-05 00:42:30 26 4
gpt4 key购买 nike

我有一个管理资源的 RAII 类。问题是,复制资源需要一个与资源无关的附加参数,而是资源复制操作的参数。

因此,我有一个需要附加参数的类复制构造函数。如果附加参数具有默认值,则允许这样做。我想编写复制赋值和移动赋值运算符(最好使用复制交换习语),但那些不允许附加参数。我可以将这个麻烦的参数设为类成员,但用户可能会错误地使用它,因为它需要在每次复制或移动赋值调用之前设置。

有什么想法可以解决这个问题吗?

struct Foo{
void* ptr;
Foo(size_t){/*allocate*/}
~Foo(){/*deallocate*/}
Foo(const Foo& that, int x = 0 /*required additional parameter for copying*/){CopyMethod(*this,that,x);}
Foo& operator=(Foo);// cannot implement without int x parameter
};

最佳答案

C++ 中没有绝对要求复制或移动必须由 operator= 或构造函数完成。

所做的只是允许通过自然使用 = 运算符或自然对象构造来产生复制或移动。

但是在 C++ 中没有关于复制或移动必须做什么或它意味着什么的通用规则。实际上,这意味着无论类(class)想要它意味着什么。不出所料,复制或移动也可以通过一些随机类方法实现,可能命名为 copy_frommove_from

I could make that troublesome argument a class member, but then users are likely to use it incorrectly,

删除复制/移动构造函数/操作符。

实现影响从该对象的另一个实例复制或移动的类方法。如果需要,这些方法可以有数百个参数。当然,那会很麻烦。在你的情况下,只有一个参数不会很麻烦。

因此,最终,复制或移动通过廉价的默认构造一个新对象,然后调用适当的类方法,迫使您的用户说明所有必需的参数是什么,并在逻辑上消除滥用类的复制/移动语义的可能性。

也可以不删除默认构造函数或运算符,但可能以某种有意义的方式实现它们,以使用默认参数值实现复制或移动,并允许在最常见的用例,但在必须发生异常情况时需要命名类方法。

谈到 C++,唯一牢记在心的就是它的语法。没有办法在任何自然 = 运算符附近粘贴一些附加值,并将其吸入复制或移动构造函数中。因此,不可能使默认的复制/移动分配以这种方式工作。但没有什么能阻止复制或移动由老式= 以外的其他东西实现。当然,显式调用命名类方法需要更多的输入,但就是这样,C++ 的语法是不可变的。

另外,请记住,C++ 库容器绝对不知道您的对象需要复制或移动的任何额外参数。他们不在乎。将这个对象放入 vector 中至少需要默认的复制语义。如果需要复制或移动某种明确的值,则无法将对象与 std::vector 一起使用。这是一个默认的复制构造函数/赋值,或者没有骰子。

关于c++ - 使用附加参数复制和移动分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73249538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com