我刚刚开始学习C++,如果这是显而易见的,请原谅我。下面的指针有什么区别?
const int i = 42;
constexpr const int *p = &i;
const int const* p2 = &i;对我来说,它们似乎都是指向一个常量int的常量指针。有什么不同吗?我什么时候可以使用每种类型的声明?
谢谢:)
发布于 2017-03-09 02:36:20
1)Meaning of constexpr int *p = &i;
p is const: it cannot be reassigned
i can be modified through p
2)Meaning of const int *p2 = &i;
p2 is non-const: it can be reassigned to point to a different int
i cannot be modified through p2 without use of a cast发布于 2017-03-09 03:02:27
这段代码是无效的C++,在大多数情况下甚至不会编译。您可能对这篇文章感兴趣:What is the difference between const int*, const int * const, and int const *?
所有三个声明
const int const* p2 = &i;
const int * p2 = &i;
int const* p2 = &i;只是写同样的东西的不同方式:一个(非常数指针)到(常量int)。大多数编译器在声明它时都会停顿,因为它不是一个标准的C++,而且可能是一个错误。
你将能够写
p2 = p3; // assign value of (pointer p3) to (pointer p2)因为(指针)不是常量,但不是
*p2 = *p3; // assign (object) pointed by (pointer p3) to (object) pointed by (pointer p2)因为指针指向的(对象)是const (本例中为const int )
但如果你愿意写
int * const p2 = &i;然后它将是一个指向(int)对象的(const指针)。那么事情就会完全相反:
p2 = p3; // don't work
*p2 = *p3; // work!您也可以编写const int * const来禁止这两个选项,或者不使用const来允许这两个选项。
Constexpr是一个非常不同的关键字。它并不是简单地说它是一个(const对象),而是说它是一个(在编译时已知值的const对象)。C++中的大多数“常量对象”不是数学意义上的“常量”,因为在同一个程序的不同运行中,它们可能是不同的。它们是在运行时创建的,我们只需告诉编译器我们以后不会更改它们。另一方面,'constexpr‘意味着它是一个一次性定义的’真实‘常量。它总是一样的,因此它被硬编码成编译过的二进制代码。由于您是初学者,因此可以将其视为#define的一个花哨的C++版本。在本例中,您试图将一个指向const int的指针声明为constexpr,但这不会发生,因为该指针在程序的不同运行时会有所不同,并且不能在编译时确定。
https://stackoverflow.com/questions/42678886
复制相似问题