4

我正在阅读一些提升代码,并遇到了这个:

inline sparse_vector &assign_temporary(sparse_vector &v) {
    swap(v);
    return *this;
}
template<class AE>
    inline sparse_vector &operator=(const sparse_vector<AE> &ae) {
        self_type temporary(ae);
        return assign_temporary(temporary);
    }

它似乎将所有构造函数映射到赋值运算符。伟大的。但是为什么 C++ 会选择让它们做不同的事情呢?我能想到的只是 scoped_ptr?

4

3 回答 3

6

为什么 C++ 曾经选择让他们做不同的事情?

因为赋值适用于完全构造的对象。在资源管理类中,这意味着每个成员指针都已经指向一个资源。将此与构造函数进行对比,其中成员在执行之前没有任何意义。

顺便说一句,在 C++ 的早期,T a(b);实际上被定义为T a; a = b;,但事实证明这是低效的,因此引入了复制构造函数。

于 2010-05-14T02:48:48.133 回答
2

请注意,名称“assign_temporary”表示分配来自临时对象,因此可以在分配过程中销毁。赋值运算符接受一些您以后可能想要使用的常规对象,因此在赋值期间销毁它不是一个选项。在这个 Boost 代码中,“assign_temporary”是右值引用赋值运算符的同义词,而您上面显示的赋值运算符是标准的 const(左值)引用赋值运算符,因此您会期望在二。

不过,我同意,赋值运算符通常是使用复制和交换技巧来实现的(使用复制构造函数创建一个副本,然后与该副本交换)。但是,该标准已经定义了在没有明确定义的情况下由编译器自动实现赋值运算符,因此更改默认实现可能会破坏现有代码。

于 2010-05-14T01:13:55.990 回答
1

出于某些原因,有时不应允许分配甚至复制某些类。例如,使用 RAII,您可以构建一个互斥类,该类打开一个锁,然后在到期时关闭锁。如果您被允许复制或分配这样的类,您可以想象将其传递到函数范围之外。这可能会在坏人手中造成坏事。

于 2010-05-14T02:52:21.097 回答