我想使用以下成语,我认为这是非标准的。我有利用返回值优化返回向量的函数:
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
.