我一直在研究C++ 11的一些新功能,我注意到的是在声明变量时使用的双符号,例如T&& var.
首先,这只野兽叫什么?我希望谷歌允许我们搜索这样的标点符号.
究竟是什么意思?
乍一看,它似乎是一个双重参考(如C风格的双指针T** var),但我很难想到一个用例.
简单来说,我有一个简单的指针:
int* a;
Run Code Online (Sandbox Code Playgroud)
现在,我想改变这个指针的值.我想在一个函数中这样做.函数确保它不会改变指针指向的对象,但会改变指针本身.这就是为什么我希望这个函数接受如下参数:非const引用(因为指针的值将被改变)到指向const对象的非const指针(指针本身可以改变)(函数保证,该对象,指针指向不会被改变).
最简单的功能是:
void function(const int*& a){
a = 0;
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试调用此函数时:
int main(){
int* a;
function(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器不满意并说:
从'const int*'函数(a)的rvalue初始化'const int*&'类型的非const引用;
我不太明白这个错误,因为对我来说没有涉及rvalue(我传递对象的引用,已经存在于堆栈中.)
问题是,我该怎么做呢?
可以在此处找到示例:https://ideone.com/D45Cid
编辑:
有人建议,我的问题是为什么将"指向非const的指针"转换为"指向const的指针"是不合法的.
我的问题是不同的,因为我没有使用指针指针我只使用指向对象/值的指针并存储对它的引用,因此情况就像在回答这个问题:
const char c = 'c';
char* pc;
const char** pcc = &pc; // not allowed
*pcc = &c;
*pc = 'C'; // would allow to modify a const object
Run Code Online (Sandbox Code Playgroud)
在我的情况下是不可能的,因为我无法取消引用顶级指针(我没有这样的指针).
此外,我质疑这个问题的完美和干净的解决方案,这个问题没有涉及
运行时为什么会出错?我期待ptr_ref无法修改ptr指向的地址,但事情似乎没有按计划进行.
int b = 3;
int* ptr = &b;
//says something about cannot convert int* to type const int*&
const int*& ptr_ref = ptr;
Run Code Online (Sandbox Code Playgroud)
在此先感谢,15岁的C++ noob