【问题标题】:Double const declaration双 const 声明
【发布时间】:2011-01-10 12:12:43
【问题描述】:

我经常看到下面的函数声明:

some_func(const unsigned char * const buffer)
{

}

知道为什么 const 在指针名称之前重复吗?

谢谢。

【问题讨论】:

  • 应该是const unsigned char* const
  • iirc unsigned char const * const 也有效
  • 不,你不会“经常”看到这样的声明。事实上,该声明是无效的,因此毫无意义。请在发布带有问题的代码时更加小心。
  • 从右到左阅读声明会让你更好地理解。 const unsigned char * const 是一个常量指针 (*const),指向一个常量 unsigned char (const unsigned char)。
  • 抱歉,已更正语法。从右到左的阅读建议非常有用,谢谢! (实际上我记得在 CS 课程中学习了一些关于 RTL 方式的编译器解析的知识 :))

标签: c++ function constants


【解决方案1】:

这使它成为一个指向 const 值的 const 指针,而不是一个指向 const 值的可变指针或一个指向可变值的 const 指针。

【讨论】:

    【解决方案2】:

    它是一个指向常量 unsigned char 的常量指针。你不能改变指针和它指向的东西。

    【讨论】:

      【解决方案3】:

      const * unsigned char const buffer表示不能修改指针buffer,也不能修改buffer指向的内存。

      【讨论】:

        【解决方案4】:

        在像const * const T 这样的声明中,第一个const(在* 之前)意味着指针 所指向的是const(即它是指向@987654325 的指针@)。 * 后面的const 表示指针本身const(即不能修改为指向其他任何东西)。

        您可以从向外声明的对象中读取声明,因此 const unsigned char * const buffer 被读作:“缓冲区是指向 const unsigned char 的 const 指针”(这就是为什么 const 应该始终放在 之后 它修改了什么——之前用它,你必须重新排列东西来造句——用它声明为unsigned char const * const buffer,翻译成英文很简单直接(或者可能是“直接向后”,因为你真的读过在这种情况下从右到左)。

        【讨论】:

          【解决方案5】:

          两篇文章可以帮助你理解 C++ 中的 const 正确性:

          【讨论】:

            【解决方案6】:

            第一个const 表示指向的数据是不变的,不能改变,而第二个const 表示指针本身不能改变:

            char my_char = 'z';
            const char* a = &my_char;
            char* const b = &my_char;
            const char* const c = &my_char;
            
            a = &other_char; //fine
            *a = 'c'; //error
            b = &other_char; //error
            *b = 'c'; //fine
            c = &other_char; //error
            *c = 'c'; //error
            

            【讨论】:

            • +1 但我是否建议添加示例来证明 const 指针可能不会被重新分配。 (即char* const x = NULL; x = &some_char;
            • @Eric 我相信我已经包含了b = &other_char; //error
            • 我相信我需要多加注意 :) 我很抱歉
            【解决方案7】:

            假设 const unsigned char * const

            每个人都是正确的,它是一个指向 const unsigned char 的 const 指针。

            C++ 类型主要从右到左读取,除非最左边有任何修饰符,然后这些修饰符从左到右读取。

            【讨论】:

              【解决方案8】:

              类型声明应该(?)阅读 RTL。 const 修改了左边的东西,但规则很复杂,因为你可以同时写 const TT const(它们的意思相同)。

              • T * const 是一个指向可变 T 的常量指针
              • T & const 将是对可变 T 的常量引用,除非引用根据定义是常量
              • T const * 是一个指向常量 T 的可变指针
              • T const & 是一个对常量 T 的引用
              • T const * const指向常量 T 的常量指针

              【讨论】:

              • 谢谢,RTL 阅读建议对此类功能案例很有用。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-21
              • 2020-01-01
              • 1970-01-01
              • 2011-10-23
              • 2010-10-03
              相关资源
              最近更新 更多