【发布时间】:2014-09-12 09:17:31
【问题描述】:
有时类会引用其他类。为此类类实现std::swap() 并不简单,因为它会导致交换原始实例而不是引用。下面的代码说明了这种行为:
#include <iostream>
class A
{
int& r_;
public:
A(int& v) : r_(v) {}
void swap(A& a)
{
std::swap(r_, a.r_);
}
};
void test()
{
int x = 10;
int y = 20;
A a(x), b(y);
a.swap(b);
std::cout << "x=" << x << "\n"
<< "y=" << y << "\n";
}
int main()
{
test();
return 0;
}
使用联合的简单解决方法:
class A
{
union
{
int& r_;
size_t t_;
};
public:
A(int& v) : r_(v) {}
void swap(A& a)
{
std::swap(t_, a.t_);
}
};
这很有效,但并不美观。有没有更好的方法在 C++ 中交换两个引用?此外,考虑到在 Stroustrup 的 “C++ 编程语言” 书中,'reference' 被定义为一个 ,C++ 标准如何解释在一个联合中混合引用和值'对象的替代名称,别名' (p.189)。
【问题讨论】:
-
简而言之,不要将引用成员用于应该完全可交换的对象。引用不是指针。别再希望他们是了。
-
+1 这个问题写得很好,并且有一个清晰、小而有效的例子。但是,不要在生产代码中使用它。听从 Angew 的建议
-
“交换两个引用”是什么意思?引用是对象的别名,所以除了交换对象之外的任何事情都会很奇怪。将引用视为指针只会增加混乱。
-
@juanchopanza:不完全是。在同一本 Stroustrup 书中,讨论了引用的属性,交换两个引用的想法与这些属性中的任何一个都不矛盾。这不像您将引用分配给彼此。对象的数量和引用被初始化的事实保持不变。
-
@bkxp 交换引用除了交换它们引用的对象之外没有任何意义。也许您可以详细说明这有什么其他含义。