gpt4 book ai didi

c++ - 将临时对象作为 LValues 传递

转载 作者:行者123 更新时间:2023-11-28 03:56:52 26 4
gpt4 key购买 nike

我想使用以下我认为不标准的成语。我有利用返回值优化返回 vector 的函数:

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

那么,我想用

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

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

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

对于我写的类,我通常将赋值实现为

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 的非愚蠢版本。

最佳答案

因为 std::vector 是一个类类型并且可以在右值上调用成员函数:

some_func().swap(some_reference);

关于c++ - 将临时对象作为 LValues 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3205552/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com