MGA*_*MGA 2 c++ types pointers const auto
这个答案声称const自动指针的行为与const'regular'(即非自动)指针的行为相同,这正是我所期望的.
但是,以下代码编译和输出100:
int n{ 99 };
const auto nPtr = &n;
++(*nPtr);
std::cout << n << '\n';
Run Code Online (Sandbox Code Playgroud)
为了深入挖掘,我检查了所有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';
Run Code Online (Sandbox Code Playgroud)
产量
intPtr:int*__ptr64
intConstPtr:int const*__ptr64
autoPtr:int*__ptr64
autoConstPtr:int*__ptr64
所以编译器似乎完全忽略了自动指针的const关键字.有人知道为什么吗?
您似乎对混乱类型推导的混乱C++指针语法感到困惑.使用从右到左的读取顺序读取正常的指针声明:
int * intPtr; // non-const pointer to non-const int
const int * intConstPtr; // non-const pointer to const int
int const * intConstPtr; // ditto
int * const intPtrConst; // const pointer to non-const int
const int * const intConstPtrConst; // const pointer to const int
int const * const intConstPtrConst; // ditto
Run Code Online (Sandbox Code Playgroud)
所以用类型演绎
auto autoPtr = &n; // non-const pointer to non-const int
const auto autoPtrConst = &n; // const pointer to non-const int
auto const autoPtrConst = &n; // ditto
Run Code Online (Sandbox Code Playgroud)
在这种情况下,auto将推导出一种类型&n(即int *)和constmodificator将应用于该指针类型,而不是指向类型的值指针类型.如果auto用int *别名替换,您将得到相同的结果:
using ptr_to_int_t = int *;
const ptr_to_int_t p; // const pointer to non-const int
ptr_to_int_t const p; // ditto
Run Code Online (Sandbox Code Playgroud)
如果您发现指针声明的这种从右到左的读取顺序令人困惑,您可以使用Straight声明库,它提供别名模板以从左到右的读取顺序声明指针类型:
const ptr<int> p; // const pointer to non-const int
ptr<const int> p; // non-const pointer to const int
Run Code Online (Sandbox Code Playgroud)
当你写作时const auto,你会说:制作推导变量的类型,const.推导变量的类型int *是指向int的指针.所以你要说:一个const变量,类型为指向int的类型.或者,更正式地:int * const.指针对象的类型仍然int是非const限定的,因此修改是没有问题的.你无法改变指针指向的内容.如果你想控制指向类型的常量,你不能只使用auto因为没有意识到它是专门推导到指针类型.所以你必须写:
const auto * intConstPtr = &n;
Run Code Online (Sandbox Code Playgroud)
这里的auto只是推导到了pointee(int),这是得到的限定const.所以这推断为:指向const-int的指针.你也可以这样写:
const auto * const intConstPtr = &n;
Run Code Online (Sandbox Code Playgroud)
对于类型const-pointer-to-const-int.虽然,在那一点上,你应该只使用一个参考.这就是为什么const指针(而不是指针指向const)在C++中并不常见,至少在某些代码库中是这样(当然有例外).