我在取消引用指针方面遇到问题
int x = 12;
int* y = &x;
int* &a = y;//This does work
int* &b = &x;//This does not work
y
和&x
不包含相同类型的值/相同值。
有人可以告诉我int*& a
实际代表什么。
编辑:1
抱歉,我没有意识到这样一个简单的代码会在c
和c++
中产生两个不同的结果。在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
答案 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