为什么不能以与指针相同的方式返回常量引用
Why cant const references be returned in the same way as pointers?
如果我们从函数返回指针,我们可以编写
const X* f();
或
X* const f();
,以这种方式控制是否可以重新分配指针或是否可以在内部修改类。但是在返回引用时,这两者似乎具有相同的含义:
const X& f();
X& const f();
似乎不可能返回一个引用,您可以在其中修改 X,但不能重新分配它? 如果这确实是不可能的,那么当指针在这方面似乎很有效时,我们为什么要返回引用呢?
更新:如前所述,引用不能重新分配。然而,这让我更加困惑,因为下面的代码打印的是 33 55,而不是我预期的 33 33。如何与无法重新分配的引用匹配?
struct X
{
X(int i_) { i = i_;}
int i;
};
struct Y
{
X& get2() {tmp2 = new X(55); return *tmp2;}
X& get() {tmp = new X(33); return *tmp;}
void print () {cout << tmp->i << endl;}
X* tmp;
X* tmp2;
};
int _tmain(int argc, _TCHAR* argv[])
{
Y y;
X& tmp2 = y.get2();
X& tmp = y.get();
y.print();
tmp = tmp2;
y.print();
return 0;
}
似乎不可能返回一个引用,您可以在其中修改 X,但不能重新分配它?
永远无法重新分配引用。它们不断引用在初始化时绑定到的相同引用。
当指针在这方面似乎很有效时,我们为什么要返回引用?
引用用法更直观,函数的调用者可以简单地使用引用,就像变量一样,这与用户必须处理取消引用等的指针不同。
你的前两个例子不一样。你可能的意思是
const X* f();
X const* f();
实际上,您可以使用引用编写相同的内容:
const X& f();
X const& f();
声明X* const f();
没有多大意义。无论如何,您都无法更改返回的指针。这只是一个值。您可以使用该值(即 f()->foo()
)或存储它(即 X* copy = f();
)。如果你存储了值,那么恒常性只取决于你存储值的变量,而不是值本身。比较int x = 4;
- x
不会仅仅因为常数而变成常量4
。
更新问题:当你这样做时 TMP = TMP2;在主函数中,您不会将对 TMP2 的引用分配给 TMP。相反,您正在复制整个对象。
要看到这一点,请给出 X 复制构造函数来打印某些内容。这样的事情应该有效:
X(X& that)
{
std::cout << "X is being copied" << std::endl;
*this = that;
}
似乎不可能返回一个引用,您可以在其中修改 X,但不能重新分配它?
事实上。引用是变量的别名,不能重新拔插(即更改为另一个变量的别名)。
如果这确实是不可能的,那么当指针在这方面似乎很有效时,我们为什么要返回引用呢?
这与其说是效力问题,不如说是语义和责任问题。
指针:
- 可能为空
- 可能意味着您需要获得对象的所有权(即,它是由
new
创建的,您必须处置它)
引用没有这些问题,因此更简单。简单是好的。因此,当您不需要指针的强大功能时,请避免自己的困境并使用引用。
- 如何在C++中以这种方式返回一行文本?
- 以最佳方式返回复制的值
- 返回带或不带 *this 的变量的确切方式不同 |这不是关于*此指针|正确性
- 返回二进制数据的通用方式,而无需原始指针
- 程序流并以安全而雄辩的方式正确返回Main()
- 有没有办法在函数以编程方式返回的引用上多次调用函数? -元组动态访问
- 拥有 std::map 的最佳方式,我可以在其中定义如果没有键时返回的内容
- 在C 中以通用方式构建对象,设置字段并返回对象
- 如何在静态单例类中以编程方式从exec方法返回
- 哪种方式将 HHOOK 消息返回到系统更好
- 返回已过滤集合的便捷方式
- 断言返回值,但以任一方式运行
- 以这种方式返回对新创建的对象的引用,这是一种安全的做法
- 我可以以这种方式返回迭代器吗?
- 设计一个以统一方式返回多个接口的类
- 为什么不能以与指针相同的方式返回常量引用
- 以最佳方式返回负数的计数
- 为什么GetLastError()根据调用方式返回0或2 ?
- 如何在C++中创建一个工厂方法,允许以多态方式返回不同的类型
- 以良好的方式返回指针