int *&x的问题

时间:2019-01-14 03:37:21

标签: c++ pointers

我在取消引用指针方面遇到问题

int x = 12;
int* y = &x;
int* &a = y;//This does work
int* &b = &x;//This does not work

y&x不包含相同类型的值/相同值。 有人可以告诉我int*& a实际代表什么。

编辑:1 抱歉,我没有意识到这样一个简单的代码会在cc++中产生两个不同的结果。在c中,此行int*& a = y只是一个错误。但是,在c++中,代码给出了我所显示的错误。

编辑:2

int *&a = y; //compiles in g++ 7.3.0 ubuntu, but not in gcc 7.3.0

int *&b = &x; //it simply throws error in g++ and gcc

2 个答案:

答案 0 :(得分:0)

在您发布的代码中,&x是一个右值,因此,如果要捕获对它的引用,则必须使用const引用来捕获它。

您需要的是int* const& b = &x

我所学到的规则(今天仍然对我有用)是从右到左阅读一个声明,以理解 constness 。在这种情况下,您会读到类似“ b是对指向int的const指针的引用”。

引用必须引用变量(即类型的命名实例)。常量引用可以引用临时对象/无名变量。例如

int x = 5; // x is a named instance of an int
int* p = &x;
int*& y = p; // the reference y is referring to the named variable p which is a pointer to an int.
int*& z = &x; // not ok because x is a named variable but "&x" is not, so a reference cannot refer to it.
int* const& w = &x; // ok because w is a const reference, not a reference.

希望有帮助。花一些时间在线阅读有关参考文献和const正确性的知识,所有这些都将变成凝胶。关于这两个主题,这里有很多很棒的问答。


这是一篇很好的文章,讨论了左值和右值:What are rvalues, lvalues, xvalues, glvalues, and prvalues?

答案 1 :(得分:0)

在C语言中,没有引用的概念,因此第三行和第四行在C语言中不起作用。

第三行是有效的C ++代码。

第四行无效,因为当您使用&x获取x的地址时,会创建一个int*的右值。您不能将右值绑定到左值引用(在这种情况下为&b)。左值引用必须绑定到左值(这是您的第三行所做的)。您可以将rvalue分配给rvalue变量,将其绑定到const lvalue reference,或将其绑定到rvalue引用(从C ++ 11开始):

int* b = &x;  //assign rvalue to a variable
int* const &b = &x; //bind rvalue to const lvalue reference
int* &&b = &x; //bind rvalue to rvalue reference