一去二悄悄 发表于 2017-11-17 21:37:38

constexpr问题

这段代码哪里错了?编译一直通不过。。。。。。
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
}

BngThea 发表于 2017-11-17 21:47:04

在 i和 j 的声明初始化中都加上 const

记得return 0;

一去二悄悄 发表于 2017-11-17 21:51:24

BngThea 发表于 2017-11-17 21:47
在 i和 j 的声明初始化中都加上 const

记得return 0;

还是不行,而且这个错误和return没关系

BngThea 发表于 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

一去二悄悄 发表于 2017-11-17 22:02:26

BngThea 发表于 2017-11-17 21:53
应该是constexpr定义的变量必须用常量进行初始化
你用 &i 和 &j 都不能对 p 和 p1 进行初始化



。。。。。我的代码就是从这个参考上得来的,试了一下结果有问题,不过constexpr声明的指针就是顶层const,按道理把&j复制给它不会出错,至于i按这样也不应该出错啊,可是。。。。。。

BngThea 发表于 2017-11-17 22:11:27

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

个人理解:
根据报错信息,指明的就是 &i 和 &j 并不是一个常量表达式
可能是编译器认定constexpr 定义的变量必须被一个常量表达式进行初始化,而且并不认为上面定义的
i 和 j 取址运算是一个常量表达式

<(¥_$)> 发表于 2017-11-18 23:42:09

对于一个c程序,变量无非是存在堆(全局变量)和栈(局部变量)中的,栈中的变量地址随着栈变化而变化,这个在编译器是没办法转换成常量的,而堆中的变量地址,可能会随着地址的重定位而改变地址,程序在编译期也是没办法确定他的地址,没办法转换成常量。所以说,这个需要常量表达式的错误可以解释了

一去二悄悄 发表于 2017-11-22 23:02:56

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

谢谢讲解,但是为什么这样写就可以呢?const和constexpr在分配内存时本质上有着什么样的区别?constexpr也是把指针声明为顶层const,这和*const p 有着什么区别呢?{:10_291:}晕死了
int main()
{
    int j = 0;
    constexpr int i = 2;
    const int *const p = &i;
    int *const p1 = &j;
}

<(¥_$)> 发表于 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字节内存,就这样
页: [1]
查看完整版本: constexpr问题