const变量赋值报错分析

const变量赋值报错

从变量到常量的赋值是合法C++的语法约定的,
如从char 到const char顺畅;
但从char **到 const char **编译器就会报错:

error: invalid conversion from `char**' to `const char**'

示例:

int main(int argc, char *argv[])
{
char a = '1';
const char b = a; char * a2 = "12345";
const char * b2 = a2; char** a3 = NULL; //const char** b3 = a3; //error
char** const c3 = a3; //ok
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

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

强制类型转换的潜在问题

看以下示例:

class Foo {
public:
Foo(){
i = 1;
}
void modify(){// make some modification to the this object
i = 2;
}
void print() const {
cout << "Foo_i:" << i << endl;
}
private:
int i;
}; //演示潜在的危险
//error: invalid conversion from `Foo**' to `const Foo**'
/////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
const Foo x;
Foo* p; //const Foo ** q = &p; //q now points to p; this is (fortunately!) an error
const Foo ** q = const_cast<const Foo **>(&p);
*q = &x; // p now points to x
p->modify(); // Ouch: modifies a const Foo!!
x.print(); // print: Foo_i:2
return 0;
}

我们定义了一个常量的Foo,常量Foo方法打印出来的永远为1;
Foo**到const Foo **的转换报错,

通过一个强转符让编译通过,

最后的x.print()的结果是2;这样的潜在危险在正式的项目代码中就很难发现;

很难会想到一个const对象还能够变更;

参考资料:

  1. 指针与const

  2. Why am I getting an error converting a Foo → Foo const?

  3. Converting Derived → Base works OK; why doesn't Derived → Base work?

const变量赋值报错分析的更多相关文章

  1. std::unique_ptr使用incomplete type的报错分析和解决

    Pimpl(Pointer to implementation)很多同学都不陌生,但是从原始指针升级到C++11的独占指针std::unique_ptr时,会遇到一个incomplete type的报 ...

  2. mysql5.7密码修改与报错分析

    1.修改密码 修改密码: vim /etc/my.cnf 的mysqld字段加入skip-grant-tables 重启MySQL,service mysqld restart 终端输入 mysql ...

  3. 微信小程序 app.js globalData 赋值报错

    //success方法要用用success: res => {}的格式 success: res => { } //赋值报错 success:function(e){ } //报错内容: ...

  4. Dev C++编写C/C++程序 出现[Error] ld returned 1 exit status报错分析及解决

    debug系列第一弹,不知道大家写程序的时候是不是都遇到过如题的报错. 我本人是经常遇到这行熟悉的令人不知所措的报错,可能是我太笨了 有时候百度无果也差不到原因,那就汇总一下目前我遇到的情况吧--持续 ...

  5. DUBBO报错分析—1(连接zookeeper成功,调用方法无反应,不报错)

    思路分析 调用方法时,最后调用执行的是mapper的sql语句,既然调用对应的方法无法获取返回值,多是sql错误,但是并未报sql错误,说明可能是与sql相关的数据源配置错误. 过程调试 经尝试,当直 ...

  6. SSM框架报错分析(一)——There is no getter for property named 'XXX' in 'class java.lang.String'

    一.发现问题 <select id="queryStudentByNum" resultType="student" parameterType=&quo ...

  7. 【原创】MySQL Can't create a new thread报错分析

    今天有两台服务器都出现了Can't create a new thread报错. [故障处理过程] 故障发生后登录服务器,检查mysql进程正常,但登录mysql报下面错误 ERROR 1135 (H ...

  8. SSH报错分析

    排错设计思路 1.配置文件的端口号修改 2.禁用root 3./etc/hosts.allow /etc/hosts.deny 4.iptables 5.密钥文件及目录的权限修改 1. 报错的原因:是 ...

  9. C++编译连接过程中关于符号表的报错分析

    是这样的,在学习郑莉老师的多文件结构和编译预处理命令章节时候,看到书里有这么一张图描述如下:#include指令作用是将指定的文件嵌入到当前源文件中#include指令所在的位置. 然后我就想5_10 ...

随机推荐

  1. 160927、用jquery 重置表单的方法

    清空 我们项目小小部分的搜索条件: 客户要做的是,只要一键 "清空搜索条件" 即可清空维护地点.订单ID等条件. js函数 //重置表单 function resetform(){ ...

  2. React笔记_(7)_react路由

    路由 路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程. 路由器当然是作为一个转发设备出现的,主要是转发数据包来实现网络互联. 那么react的路由到底指的是什么呢? 举个 ...

  3. __ATTRIBUTE__ 你知多少?【转】

    转自:http://www.cnblogs.com/astwish/p/3460618.html GNU C 的一大特色就是__attribute__ 机制.__attribute__ 可以设置函数属 ...

  4. UIView完全置顶的方法

    一般来说,若需要独立添加一个UIView,使其覆盖于整个应用窗口之上,是这样实现的: AppDelegate *app = (AppDelegate *)[[UIApplication sharedA ...

  5. error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 E:\OCX

    VC项目从VS2008迁移到VS2010编怿出错. 解决方法: 对比Framework和vs的安装目录下的cvtres.exe文件版本,删除旧版本即可 C:\Windows\Microsoft.NET ...

  6. C# Community Projects

    Community Supported C# Drivers See the officially supported MongoDB C# driver mongodb-csharp driver ...

  7. Hibernate,JPA注解@SecondaryTables

    使用类一级的 @SecondaryTable或@SecondaryTables注解可以实现单个实体到多个表的映射. 使用 @Column或者 @JoinColumn注解中的table参数可指定某个列所 ...

  8. iOS 开发 证书总结 开发证书和生产证书的区别

    IOS开发 证书总结 开发者证书   ------>>  开发证书是你在真机推送时 用得, 生产证书是app 上架之后 推送给用户用的 首先你必须获得apple开发者证书,上图这个文件就是 ...

  9. 阿里云ECS主机多个网站配置,是有先后顺序的

    注意:阿里云ECS主机多个网站配置,是有先后顺序的: 进入路径:/alidata/server/httpd-2.4.2/conf/vhosts/  注意这个2.4.2是自己的版本不一样,但是找到 se ...

  10. java面试每日一题12

    题目:打印出如下图案(菱形)     *    ***  ****** ********  ******   ***    * public class Diamond { public static ...