gpt4 book ai didi

c++ - 引用指针的问题

转载 作者:行者123 更新时间:2023-11-28 03:55:35 25 4
gpt4 key购买 nike

为什么这不能编译:

// RefToPointers.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using std::cout;

class T
{
public:
T(int* value):data_(value)
{
}
int* data_;
int* getData_()
{
return data_;
}
int getValue()//<----------Here I do not return by ref
{
return *data_;
}
};



void fnc(const int*& left, const int*& right )//<------Doesn't work even though
//it is identical to the example below just type is different. Why?
{
const int* tmp = left;
left = right;
right = tmp;
}

void fnc(const int& left,const int& right)//<---Here I pass by ref
{

}

int _tmain(int argc, _TCHAR* argv[])
{
//int* one = new int(1);
//int* two = new int(2);
//cout << "Pointers before change:" << *one << '\t' << *two << '\n';
//fnc(one,two);
//cout << "Pointers before change:" << *one << '\t' << *two << '\n';

T one(new int(1));


T two(new int(2));
fnc(one.getData_(),two.getData_());//<---This do not work
fnc(one.getValue(),two.getValue());//<<------This still works even thoug I'm
//returning by value and fnc is taking args by ref. Why does it work with int
//by not with int*?
return 0;
}

出现以下错误:

_error C2664:“fnc”:无法将参数 1 从“int *”转换为“int *&_”

为什么下划线不会在列出错误的行中使字体变为斜体?

最佳答案

getData() 返回一个右值。您不能引用右值指针。

你有两个选择:

1) 传递 fnc() 左值:

int* lhs = one.getData_();
int* rhs = two.getData_();
fnc(lhs, rhs);

2) 或者,既然你传递的是指针引用,它们实际上与指针本身大小相同,为什么不传递指针呢?

void fnc(int* left, int* right )
{
int* tmp = left;
left = right;
right = tmp;
}

编辑:

更多关于左值和右值的内容。 “左值”曾经表示“可以位于 = 操作左侧的表达式”。右值实际上是相反的:右值是任何不能位于 = 操作左侧的表达式。

事情比现在复杂一点,但这仍然是理解左值和右值的一种很好的方式。

现在,考虑以下代码:

int val()
{
return 42;
}

int main()
{
int* p = &val();
}

val() 按值返回一个 int -- 换句话说,它返回一个未命名的临时值。您应该能够获取该临时地址吗?

您可能会想,“嗯,是的,为什么不呢?”但答案其实是否定的,你不能拿临时的地址。原因与该临时文件的生命周期有关。它的范围仅限于创建它的表达式。换句话说:val()。一旦 val() 被完全评估,临时文件就不再存在。实际上,它从堆栈中掉了下来。到评估 int* p = & 时,临时文件早已消失。没有什么可以取地址了。

这基本上就是为什么您不能获取右值地址的原因,推而广之,这就是为什么您不能获得对右值地址的引用的原因。

关于c++ - 引用指针的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3781623/

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