这个成语是什么,什么时候应该使用?它解决了哪些问题?当使用C++ 11时,成语是否会改变?
虽然在许多地方已经提到过,但我们没有任何单一的"它是什么"问题和答案,所以在这里.以下是前面提到的地方的部分列表:
c++ c++-faq copy-constructor assignment-operator copy-and-swap
这确实是交换两个引用的一个坏主意。这些引用不应重设,因此不可能。我知道的那么多。
我想要做的,就是交换两个引用,在某种程度上人们会交换两个指针:地址被交换,但没有数据。假设:
int a = 0, b = 1;
int *pA = &a, *pB = &b;
std::swap(pA, pB);
Run Code Online (Sandbox Code Playgroud)
现在* pA为1,* pB为0,但是a仍然为0,b仍然为1。但是,对于引用,这是不可能的:
int a = 0, b = 1;
int &rA = a, &rB = b;
std::swap(pA, pB);
Run Code Online (Sandbox Code Playgroud)
现在,引用被交换了,但是原始值也被交换了。我唯一能想到的是:
template <class _Ty>
struct resetable_ref {
_Ty &ref;
inline resetable_ref(resetable_ref &r)
:ref(r.ref)
{}
inline resetable_ref(_Ty &_ref)
:ref(_ref)
{}
inline resetable_ref &operator =(resetable_ref &r)
{
if(sizeof(resetable_ref) == sizeof(void*)) // compile-time constant (true)
*reinterpret_cast<void**>(this) = *reinterpret_cast<void**>(&r);
else
memcpy(this, &r, sizeof(resetable_ref)); …Run Code Online (Sandbox Code Playgroud)