浅谈const变量赋值报错分析

2020-01-06 13:08:07王振洲
在类中 只有静态变量能赋值 如果你不赋值 编译器会认为你这个变量根本没用 不能被修改 又没有初始值 两个办法 在构造函数的初始化列表赋值 或者在const前面加一个static    

从变量到常量的赋值是合法C++的语法约定的, 

如从char 到const char顺畅; 
但从char **到 const char **编译器就会报错:

 

复制代码
error: invalid conversion from `char**' to `const char**'

 

示例:
 

  1. int main(int argc, char *argv[])  { 
  2.   char a = '1';    const char b = a; 
  3.     char * a2 = "12345"; 
  4.   const char * b2 = a2;   
  5.   char** a3 = NULL;   
  6.   //const char** b3 = a3; //error     char** const c3 = a3; //ok 
  7.    char* const * d3 = a3; //ok  } 
?

原因: 

const char** b3 说明 b3的指针可以变更,可以再指向另外一个地址; 
b3和a3都是unqualified的,但b3指向的对象类型为pointer to const char, 
a3指向的对象类型为 pointer to char,两者是不相容类型, 
不符合两操作数必须指向相容类型的规定,因此赋值非法。 
更详细的解释详见参考资料1;

而char** const c3 = a3;正确,则是因为const限制了c3指针的地址变更,即它指向了a3,就不再能变更指向其它指针了;这就限制了指针地址变更可能发生的潜在问题;

当然这时候,使用一个强制类型转换,可以解决这个编译错误:

 

复制代码
    const char** b3 = const_cast<const char**>(a3); // ok

 

但转换后的代码再出现问题就很难排查了;

强制类型转换的潜在问题