鱼C论坛

 找回密码
 立即注册
查看: 2427|回复: 8

[已解决]constexpr问题

[复制链接]
发表于 2017-11-17 21:37:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这段代码哪里错了?编译一直通不过。。。。。。
int main()
{
    int j = 0;
    constexpr int i = 2;
    constexpr const int *p = &i; // const pointer, const data
    constexpr int *p1 = &j; // const pointer, non-const data
}
最佳答案
2017-11-25 00:31:41
一去二悄悄 发表于 2017-11-22 23:02
谢谢讲解,但是为什么这样写就可以呢?const和constexpr在分配内存时本质上有着什么样的区别?constexpr ...

constexpr表示的是编译器间就要把值算出来,所以你这些取地址的变量都不能通过constexpr来定义

然后讲讲这个const,const type *这种const在*前面的表示指针指向的内容不能修改,type * const这种*在const前面的表示这个指针不能修改

对于这个程序,const和constexpr分配内存这一点没有什么区别,对于32位程序来说就是在栈上分配4字节内存,就这样

报错信息

报错信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-17 21:47:04 | 显示全部楼层
在 i  和 j 的声明初始化中都加上 const

记得return 0;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-17 21:51:24 | 显示全部楼层
BngThea 发表于 2017-11-17 21:47
在 i  和 j 的声明初始化中都加上 const

记得return 0;

还是不行,而且这个错误和return没关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-17 21:53:30 | 显示全部楼层
一去二悄悄 发表于 2017-11-17 21:51
还是不行,而且这个错误和return没关系

应该是constexpr定义的变量必须用常量进行初始化
你用 &i 和 &j 都不能对 p 和 p1 进行初始化

可以参考:
http://blog.csdn.net/yhl_leo/article/details/50864210
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-17 22:02:26 | 显示全部楼层
BngThea 发表于 2017-11-17 21:53
应该是constexpr定义的变量必须用常量进行初始化
你用 &i 和 &j 都不能对 p 和 p1 进行初始化

。。。。。我的代码就是从这个参考上得来的,试了一下结果有问题,不过constexpr声明的指针就是顶层const,按道理把&j复制给它不会出错,至于i按这样也不应该出错啊,可是。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-17 22:11:27 | 显示全部楼层
一去二悄悄 发表于 2017-11-17 22:02
。。。。。我的代码就是从这个参考上得来的,试了一下结果有问题,不过constexpr声明的指针就是顶层const ...

个人理解:
根据报错信息,指明的就是 &i 和 &j 并不是一个常量表达式
可能是编译器认定constexpr 定义的变量必须被一个常量表达式进行初始化,而且并不认为上面定义的
i 和 j 取址运算是一个常量表达式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-18 23:42:09 | 显示全部楼层
对于一个c程序,变量无非是存在堆(全局变量)和栈(局部变量)中的,栈中的变量地址随着栈变化而变化,这个在编译器是没办法转换成常量的,而堆中的变量地址,可能会随着地址的重定位而改变地址,程序在编译期也是没办法确定他的地址,没办法转换成常量。所以说,这个需要常量表达式的错误可以解释了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-22 23:02:56 | 显示全部楼层
<(¥_$)> 发表于 2017-11-18 23:42
对于一个c程序,变量无非是存在堆(全局变量)和栈(局部变量)中的,栈中的变量地址随着栈变化而变化,这 ...

谢谢讲解,但是为什么这样写就可以呢?const和constexpr在分配内存时本质上有着什么样的区别?constexpr也是把指针声明为顶层const,这和*const p 有着什么区别呢?晕死了
int main()
{
    int j = 0;
    constexpr int i = 2;
    const int *const p = &i; 
    int *const p1 = &j; 
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-25 00:31:41 | 显示全部楼层    本楼为最佳答案   
一去二悄悄 发表于 2017-11-22 23:02
谢谢讲解,但是为什么这样写就可以呢?const和constexpr在分配内存时本质上有着什么样的区别?constexpr ...

constexpr表示的是编译器间就要把值算出来,所以你这些取地址的变量都不能通过constexpr来定义

然后讲讲这个const,const type *这种const在*前面的表示指针指向的内容不能修改,type * const这种*在const前面的表示这个指针不能修改

对于这个程序,const和constexpr分配内存这一点没有什么区别,对于32位程序来说就是在栈上分配4字节内存,就这样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-28 23:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表