gpt4 book ai didi

c++ - 交换对象不实现 move 语义时的交换函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:04 24 4
gpt4 key购买 nike

我正在阅读 C++ 中的 move 语义,并遇到以下示例作为动机:

template<class T> 
void swap(T& a, T& b)
{
T tmp(std::move(a));
a = std::move(b);
b = std::move(tmp);
}

这里说如果 T 没有实现 move 语义(在复制构造函数和赋值运算符中),那么交换将表现为“正常”交换:

template<class T>
void swap(T& a, T& b)
{
T tmp(a);
a = b;
b = tmp;
}

为什么是这样?据说here (最后一段)因为 std::move(b) 是右值,我们不能调用带有签名的赋值运算符 Type& operator=(Type&)a = std::move(b);.

最佳答案

这里的问题是右值引用 (T&&) 只能绑定(bind)到右值。非常量左值引用 (T&) 只能绑定(bind)到左值。但是总是可以使用 const T&,由于历史原因,它可以绑定(bind)到右值和左值。

这就是为什么您可以将字符串文字传递给 const std::string& 的原因。

关于c++ - 交换对象不实现 move 语义时的交换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46528803/

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