C++中常量自动指针的行为
Behavior of const auto pointers in C++
这个答案声称const自动指针的行为与const"regular"(即非自动)指针相同,这正是我所期望的。
但是,以下代码编译并输出100
:
int n{ 99 };
const auto nPtr = &n;
++(*nPtr);
std::cout << n << 'n';
为了更深入地挖掘,我检查了所有4种指针的类型,这是我得到的结果:
代码
int n{ 99 };
int* intPtr = &n;
const int* intConstPtr = &n;
auto autoPtr = &n;
const auto autoConstPtr = &n;
std::cout << "intPtr: " << typeid(intPtr).name() << 'n';
std::cout << "intConstPtr: " << typeid(intConstPtr).name() << 'n';
std::cout << "autoPtr: " << typeid(autoPtr).name() << 'n';
std::cout << "autoConstPtr: " << typeid(autoConstPtr).name() << 'n';
输出
intPtr:int*__ptr64
intConstPtr:int const*__ptr64
autoPtr:int*__ptr64
autoConstPtr:int*__ptr64
因此编译器似乎完全忽略了带有自动指针的const关键字。有人知道为什么会这样吗?
当您编写const auto
时,您会说:使推导变量的类型const。推导变量的类型为int *
,即pointer-to-int。所以你说的是:一个常量变量,类型为pointer-to-int。或者,更正式地说:int * const
。指针对象的类型仍然只是int
,非常量限定,所以修改是没有问题的。你不能改变指针指向的内容。如果你想控制被指向类型的常量,你不能只使用auto
,因为你不知道它是专门推导到指针类型的。所以你必须写:
const auto * intConstPtr = &n;
这里的auto只是推导到pointee(int),它是由const
限定的。因此,这推导为:pointer-to-const-int。你也可以写:
const auto * const intConstPtr = &n;
对于类型const-pointer-to-const-int。不过,在这一点上,你可能只应该使用一个参考。这就是为什么const指针(与指向const的指针相反)在C++中并不常见,至少在一些代码库中是这样(当然也有例外)。
这里,const auto
被转换为int *const
,而不是const int*
。不同之处在于,它是指向(变量)int
的常量指针,而不是指向常量int
。在这种情况下,这意味着您可以执行++(*nPtr);
,但不能将nPtr
更改为指向不同的int
。
要查看此信息,请尝试添加行
int i{ 17 };
nPtr = &i
具有不同const
资格的int
指针的四种变体(在没有auto
的情况下指定)是:
int*
:指向可修改int
的可修改指针。您可以更改它指向的int
,也可以使用它来更改该int
的值。这就是只需auto nPtr = &n
即可获得的结果int *const
:指向可修改int
的固定指针。它将始终指向相同的int
,但您可以使用它来更改该int
的值。这就是const auto nPtr = &n
或auto const nPtr = &n
的结果int const *
或const int*
:指向常量int
的可修改指针。您可以更改它指向的int
,但不能使用它来更改该int
的值int const *const
或const int *const
:指向常量int
的常量指针。您不能更改它指向的int
,也不能使用它来更改该int
的值
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- C++中的指针和常量问题不大
- 为什么我收到"从常量指针到指针的转换无效?
- 当成员值从指针更改为非指针时,C++常量问题
- 使用双指针传递 2D 常量数组
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 模板推导:为什么函数指针模板定义在常量和/或引用时不匹配?
- 初始化指针的常量向量
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 无法将"常量指针常量"传递给常量引用
- C++:如何创建一个临时对象,包含一个指针 - 常量或非常量,具体取决于上下文
- 具有函数指针常量数组的 C++ 模板化静态类
- 这个constexpr整数不是空指针常量吗
- 使指针常量C++
- C++11在stl容器中共享指针常量
- 空指针常量转换为右值
- 在参考 (T&) 和常量指针 (T* 常量) 之间进行选择