让我使用矢量对象作为示例,但它适用于任何对象。
创建一个对象是否安全
MyVector xyz(std::vector<double>(10));
假设有一个构造函数将
std::vector<double>
作为输入?
有人告诉我这是错误的,因为矢量会立即释放。然而,对我来说,这似乎是正确的,因为我用它来创建我自己的向量
xyz
。看起来像一个复制构造函数。
非常感谢
安全取决于
MyVector
的实施。如果该类编写良好且文档齐全,那么这是安全的,除非文档另有说明。如果文档说参数的生命周期必须超过构造对象的生命周期,那么这是不安全的。话虽这么说,从临时对象构建并不是“危险信号”或“代码味道”;大多数时候(大约 90+%),这样的建筑是安全的。
“写得好”是什么意思?如果构造函数通过值 (
T
) 或右值引用 (T&&
) 获取其参数,则它不得保留对该参数的引用。唯一允许保留对参数的引用的情况是当参数由左值引用 (T&
) 获取时,即使这样,这种使用也不常见,因此必须记录在案。理想情况下,如果保留引用,则参数应该是非const
左值引用,以便临时对象无法绑定到它。不过,我可以接受,可能存在更高优先级的考虑因素,需要采用 const
参考。
所以有一个小漏洞不是简单地写好一个类就可以覆盖的。也许该类需要保留对其构造函数参数的引用。也许该参数需要是一个
const
参考。这些要求中的每一个都是/应该是不常见的,但它们的交集是非空的。这就是“有据可查”的用武之地。如果还不清楚:在这种情况下,“有据可查”意味着如果构造函数不寻常到足以保留对其参数的引用,那么必须在某种形式的文档。