相关疑难解决方法(0)

为什么将"指向非const的指针"转换为"指向const的指针"是不合法的

合法的指针到非const转换为指针到常量.

那么为什么将指向非const指针转换为指向const指针是不合法的呢?

例如,为什么以下代码是非法的:

char *s1 = 0;
const char *s2 = s1; // OK...
char *a[MAX]; // aka char **
const char **ps = a; // error!
Run Code Online (Sandbox Code Playgroud)

c++ pointers const const-correctness

35
推荐指数
5
解决办法
5875
查看次数

为什么用指向非 const 的指针初始化的对 const 指针的右值引用不会创建临时对象并将其与其绑定?

如果我们想用不同的类型初始化引用,我们需要将其设置为 const (const type*),以便可以隐式生成临时对象并将引用绑定到 with。或者,我们可以使用右值引用并实现相同的[1]:

右值引用可用于延长临时对象的生命周期(注意,对 const 的左值引用也可以延长临时对象的生命周期,但不能通过它们进行修改):

[...]

样品

情况1

double x = 10;

int &ref = x; //compiler error (expected)
Run Code Online (Sandbox Code Playgroud)

案例2

double x = 10;
const int &ref = x; //ok
Run Code Online (Sandbox Code Playgroud)

案例3

double x = 10;
int &&ref = x; //ok
Run Code Online (Sandbox Code Playgroud)

如果我们尝试对 const 指针(const type* &)做同样的事情,并用非 const 指针(type*)初始化它,与我预期的不同,只有情况 2 有效。为什么情况3会导致编译器错误?为什么没有生成临时文件?

情况1

int x = 10;

int *pX = &x;

const int* &ref = pX; //compiler error (expected)
Run Code Online (Sandbox Code Playgroud)

案例2

int x = 10;
int *pX = &x;
const int* …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference rvalue-reference temporary-objects

6
推荐指数
1
解决办法
533
查看次数