gpt4 book ai didi

c++ - 什么是constexpr?

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:12 25 4
gpt4 key购买 nike

好的,所以我正在阅读 C++ Primer,第五版,并且我是第一次学习 constexpr。开头是这样说的:

It is important to understand that when we define a pointer in a constexpr declaration, the constexpr specifier applies to the pointer, not the type to which the pointer points:

 const int *p = nullptr; // p is a pointer to a const
*q = nullptr; // q is a const pointer to int

好吧,我想我自己......好吧,它 p 是一个指向 const 的指针,那么它意味着 p(指针)本身不是一个常量,所以我可以改变它。所以当然,我在我的 IDE 上试了一下:

#include <iostream>
#include <list>
#include <vector>
#include <string>


int main()
{
const int x = 0;
const int y = 30;
const int *p = x;
*p = &y;
return 0;
}

猜猜看。当我尝试将 *p 分配给常量 y 的地址时,它给了我一个错误。嗯具体错误

error: assignment of read-only location '* p'|

哇,我惊呆了。我真的以为书上说 p 是指向 const 的指针。所以我认为 p 本身不是常数,所以你可以改变它。?还是我的分析有误??

然后当然它告诉我:

constexpr int *q = nullptr; // q is a const pointer to int

好吧,如果我之前的类比是正确的,那么这个指针就是一个实际的 const 本身。所以它可能不会改变..?还是我还是错了?

构造函数

好的,伙计们,我明白了。当我将指针分配给“对象”或任何东西时,我不应该取消引用。但是现在我第一次尝试 constexpr 时遇到了这个错误!

error: invalid conversion from 'const int*' to 'int*' [-fpermissive]|

这是我的代码:

int main()
{
const int a = 0;
const int i = 5;
constexpr int *w = &a;
return 0;
}

最佳答案

你打错了。当你做 *p取消引用指针可以让您访问底层 const int你无法改变。

p = &y;

另一方面改变了什么p指着。具体来说,它改变了 p指向y这是合法的。

int main()
{
const int x = 0;
const int y = 30;
const int *p = &x;
std::cout << *p << "\n";
p = &y;
std::cout << *p;
return 0;
}

输出:

0
30

Live Example

我也得改

const int *p = x;

const int *p = &x;

否则你正在尝试用 x 的值初始化指针而不是 x 的地址.


constexpr错误与指针的类型以及您要指向的内容有关。

constexpr int *w = &a;

说给我一个 int *并让它指向a并将其设为 constexpr .现在aconst int不是int尝试这样做会删除 consta这是非法的。

如果我们把它改成

constexpr const int *w = &a;

然后我们有了正确的类型,但现在我们有一个新的错误。 a不是 constexpr所以它不能用于 constexpr初始化,因为它是一个局部变量,在运行时只有一个地址。如果我们制作a static或全局变量,那么地址将在编译时已知,我们可以在 constexpr 中使用它.

关于c++ - 什么是constexpr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36914017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com