复制构造函数并创建临时对象 C++

问题描述 投票:0回答:1

让我使用矢量对象作为示例,但它适用于任何对象。

创建一个对象是否安全

MyVector xyz(std::vector<double>(10)); 

假设有一个构造函数将

std::vector<double>
作为输入?

有人告诉我这是错误的,因为矢量会立即释放。然而,对我来说,这似乎是正确的,因为我用它来创建我自己的向量

xyz
。看起来像一个复制构造函数。

非常感谢

c++ memory-management constructor copy-constructor
1个回答
0
投票

安全取决于

MyVector
的实施。如果该类编写良好且文档齐全,那么这是安全的,除非文档另有说明。如果文档说参数的生命周期必须超过构造对象的生命周期,那么这是不安全的。话虽这么说,从临时对象构建并不是“危险信号”或“代码味道”;大多数时候(大约 90+%),这样的建筑是安全的。

“写得好”是什么意思?如果构造函数通过值 (

T
) 或右值引用 (
T&&
) 获取其参数,则它不得保留对该参数的引用。唯一允许保留对参数的引用的情况是当参数由左值引用 (
T&
) 获取时,即使这样,这种使用也不常见,因此必须记录在案。理想情况下,如果保留引用,则参数应该是非
const
左值引用,以便临时对象无法绑定到它。不过,我可以接受,可能存在更高优先级的考虑因素,需要采用
const
参考。

所以有一个小漏洞不是简单地写好一个类就可以覆盖的。也许该类需要保留对其构造函数参数的引用。也许该参数需要是一个

const
参考。这些要求中的每一个都是/应该是不常见的,但它们的交集是非空的。这就是“有据可查”的用武之地。如果还不清楚:在这种情况下,“有据可查”意味着如果构造函数不寻常到足以保留对其参数的引用,那么必须在某种形式的文档。

© www.soinside.com 2019 - 2024. All rights reserved.