当前位置: 代码迷 >> PB >> 重发const / 右值有关问题
  详细解决方案

重发const / 右值有关问题

热度:78   发布时间:2016-04-29 08:18:46.0
重发const / 右值问题
之前发过的帖子时间久了没人关注了,这里重发下:
C/C++ code
void f1( const int *& t){   }void f2( const int *const& t){   }int _tmain(int argc, _TCHAR* argv[]){        int* p;    f1(p); //不能将参数 1 从“int *”转换为“const int *&    f2(p);//正常编译        return 0;}


问题是f1不能正常编译?而f2可以呢?
像下面这样,指向const类型的指针不是可以指向非指向const类型的吗?
C/C++ code
int*pp1;
------------------------------------------
有位大侠说“非const 指针是可以转换成const 指针,但是转换过来的结果是一个右值.
一个右值可以绑定到const 的引用上,不能绑定到非const 引用.故1不行,2行.”


但是,若转换结果是右值的话对于vs2010的右值引用为什么也不行呢? 望指教~~谢谢!
C/C++ code
void f3(const int*&&){    }int* p;f3(p);//错误


------解决方案--------------------
首先这里的p并非是什么右值。再者int*const&这样的写法 如果用typedef你也许更清楚些。

typedef int* INT_PTR;
INT_PTR p1;
INT_PTR const &ref=p1;

而 对于 const int*&来说 const 用来限制 指针所指对象,而非限制引用。而你认为int *const &ref;的const限制的是指针本身的指向 我是不太同意的。我的观点是const作用于引用。就是说你不能通过引用来修改指针的指向。这点在效果上和你说的int*const ptr;是一样的。但是理解上不同。
于是这样的问题就有点类似我前面提到的例子了。

如果更简化这个问题 去掉指针 那么就变成了 int p ; const int&ref=p;非const变量是可以由const 引用绑定的。
------解决方案--------------------
探讨
但是,若转换结果是右值的话对于vs2010的右值引用为什么也不行呢? 望指教~~谢谢!

void f3(const int*&&)
{

}
int* p;
f3(p);//错误


------解决方案--------------------
探讨

引用:
但是,若转换结果是右值的话对于vs2010的右值引用为什么也不行呢? 望指教~~谢谢!

void f3(const int*&&)
{

}
int* p;
f3(p);//错误



这是C++11的规定,两个引用相关的类型的右值引用不能引用其左值,这是禁止的。

此外,2楼用错了条款,应该使用8.5.3中的引用相容性原理。
……
  相关解决方案