代码之家  ›  专栏  ›  技术社区  ›  MGA

C++中常量自动指针的行为[重复]

  •  5
  • MGA  · 技术社区  · 7 年前

    This answer

    但是,以下代码编译并输出 100 :

    int n{ 99 };
    const auto nPtr = &n;
    ++(*nPtr);
    std::cout << n << '\n';
    

    密码

    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';
    

    输出

    intConstPtr:int const*\uu ptr64

    自动传输:int*\uu ptr64

    自动约束:int*\uu ptr64

    因此编译器似乎完全忽略了带有自动指针的const关键字。有人知道为什么吗?

    2 回复  |  直到 5 年前
        1
  •  10
  •   Nir Friedman    7 年前

    当你写作时 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。不过,在这一点上,您可能应该只使用引用。这就是为什么常量指针(相对于指向常量的指针)在C++中并不那么常见,至少在一些代码库中是这样(当然也有例外)。

        2
  •  3
  •   Daniel H    7 年前

    在这里 const auto 正在转换为 int *const const int* . 区别在于它是一个 指向(变量)的常量指针 int 指向常数的(变量)指针 整数 . 在这种情况下,这意味着你可以 ++(*nPtr); nPtr 指向不同的 整数 .

    要查看此信息,请尝试添加行

    int i{ 17 };
    nPtr = &i
    

    的四个变体 整数 指针具有不同的 const 资格,规定无 auto ,是:

    • int* :指向可修改的 整数 . 你可以改变哪个 整数 它指向,你可以用它来改变它的值 整数 . 这就是你得到的 auto nPtr = &n .
    • int*const :指向可修改的 . 它总是指向同一个 整数 ,但你可以用它来改变它的值 整数 . 这就是你得到的 const auto nPtr = &n auto const nPtr = &n .
    • int const * 常数int* :指向常数的可修改指针 整数 . 你可以改变哪个 整数 它指向,但你不能用它来改变它的值 整数 .
    • int const *const const int *const :指向常数的常数指针 整数 整数 它指向,你不能用它来改变它的值 .