gpt4 book ai didi

c++ - 在具有 move 语义的 RAII 类中,默认构造函数应该做什么?

转载 作者:可可西里 更新时间:2023-11-01 17:37:05 25 4
gpt4 key购买 nike

move 语义非常适合 RAII 类。它们允许人们像拥有值(value)语义一样进行编程,而无需付出大量复制的代价。一个很好的例子是 returning std::vector from a function .然而,使用值语义编程意味着,人们会期望类型表现得像原始数据类型。这两个方面有时似乎是矛盾的。

一方面,在 RAII 中,人们会期望默认构造函数返回一个完全初始化的对象,或者如果资源获取失败则抛出异常。这保证了任何构造的对象都将处于有效且一致的状态(即可以安全使用)。

另一方面,对于 move 语义,当对象位于 valid but unspecified state 中时存在一个点.同样,原始数据类型可以处于未初始化状态。因此,对于值语义,我希望默认构造函数在这个有效但未指定的状态下创建一个对象,以便以下代码具有预期的行为:

// Primitive Data Type, Value Semantics
int i;
i = 5;

// RAII Class, Move Semantics
Resource r;
r = Resource{/*...*/}

在这两种情况下,我都希望“繁重”的初始化只发生一次。我想知道,这方面的最佳做法是什么?显然,第二种方法存在一个小的实际问题:如果默认构造函数创建未指定状态的对象,那么如何编写一个确实获取资源但不采用额外参数的构造函数? (想到标签调度...)

编辑:一些答案质疑试图让您的类像原始数据类型一样工作的基本原理。我的一些动力来自Alexander Stepanov's Efficient Programming with Components ,他在那里谈论常规类型。特别是,让我引用:

Whatever is a natural idiomatic expression in c [for built-in types], should be a natural idiomatic expression for regular types.

他继续提供与上述几乎相同的示例。他的观点在这种情况下是否无效?我理解错了吗?

编辑: 由于讨论不多,我即将接受投票最高的答案。在默认构造函数中以“类似 move ”状态初始化对象可能不是一个好主意,因为同意现有答案的每个人都不会期望这种行为。

最佳答案

Programming with value semantics however means, that one would expect types to behave like primitive data types.

关键字“喜欢”。不是“完全相同”。

Therefore, with value semantics, I would expect the default constructor to create an object in this valid but unspecified state

我真的不明白你为什么要这样。这对我来说似乎不是一个非常理想的功能。

what is the best practice regarding this?

忘记非 POD 类应该与原始数据类型共享此功能的想法。打错头了如果没有明智的方法来初始化一个没有参数的类,那么该类不应该有默认构造函数。

如果你想声明一个对象,但推迟初始化它(可能在更深的范围内),那么使用 std::unique_ptr

关于c++ - 在具有 move 语义的 RAII 类中,默认构造函数应该做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18168702/

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