【发布时间】:2014-02-27 20:02:29
【问题描述】:
在标准(20.2.2 [utility.swap])中,std::swap 是为左值引用定义的。我知道这是您想要交换两件东西的常见情况。但是,有时交换右值是正确且可取的(当临时对象包含引用时,例如这里:swap temporary tuples of references)。
为什么右值没有重载?对右值进行无意义交换的风险是否大于潜在收益?
是否有合法的方式来支持交换包含引用的右值 std::tuple 对象?对于用户定义的类型,我会专门使用 swap 来按值接受其参数,但对于像 std::tuple 这样的库类型,这样做似乎并不合理。
【问题讨论】:
-
交换它们的行为会立即要求将它们转换为左值,这意味着您可以使用
std::swap。 -
这不是和将右值分配给左值对象基本一样吗?因为临时的无论如何都不能在之后使用,所以它还不如直接(右值)赋值而不是交换。
-
我需要一些理由来证明“有时交换右值是正确和可取的(当临时对象包含引用时......)”,我认为你错了。就像@Excelcius 所说,交换右值似乎在语义上没有意义。
-
您不能
swap包含引用的元组:引用无法交换。 -
@Yakk 但为了使其有意义,这些参数中的至少 1 个 必须 是左值......否则它什么也不做。并且尝试交换引用无论如何都会中断,因为您无法将引用重新分配到新位置(根据定义它们不可交换
§ 17.6.3.2)。