0

我想使用以下成语,我认为这是非标准的。我有利用返回值优化返回向量的函数:

vector<T> some_func()
{
    ...
    return vector<T>( /* something */ );
}

然后,我想使用

vector<T>& some_reference;
std::swap(some_reference, some_func());

some_func不返回 LValue。上面的代码很有意义,我发现这个成语非常有用。但是,它是非标准的。VC8 只发出最高警告级别的警告,但我怀疑其他编译器可能会拒绝它。

我的问题是:是否有某种方法可以实现我想做的相同的事情(即构造一个向量,分配给另一个向量,然后销毁旧的向量),它是合规的(并且不使用赋值运算符,见下文) ?

对于我写的课程,我通常将分配实现为

class T
{
    T(T const&);
    void swap(T&);
    T& operator=(T x) { this->swap(x); return *this; }
};

它利用了复制省略,解决了我的问题。然而,对于标准类型,我真的很想使用,swap因为我不想要临时的无用副本。

而且由于我必须使用 VC8 并生成标准 C++,我不想听到有关 C++0x 及其右值引用的信息。

编辑:最后,我想出了

typedef <typename T>
void assign(T &x, T y)
{
    std::swap(x, y);
}

当我使用左值时,因为如果 y 是临时的,编译器可以自由优化对复制构造函数的调用,并std::swap在我有左值时继续使用。我使用的所有类都是“必需的”来实现非愚蠢版本的std::swap.

4

3 回答 3

1

如果您不想要无用的临时副本,请不要按值返回。使用(共享)指针,通过要填充的引用传递函数参数,插入迭代器,...。

您想按价值返回是否有特定原因?

于 2010-07-08T16:43:18.353 回答
1

由于std::vector是类类型,并且可以在右值上调用成员函数:

some_func().swap(some_reference);
于 2010-07-08T20:40:17.060 回答
0

我知道的唯一方法 - 在标准的约束内 - 实现您想要的内容是应用表达式模板元编程技术:http ://en.wikipedia.org/wiki/Expression_templates在您的情况下这可能容易也可能不容易。

于 2010-07-08T16:54:41.053 回答