【问题标题】:what's the syntax to bind reference to pointer?(all kinds)将引用绑定到指针的语法是什么?(各种)
【发布时间】:2018-07-26 14:00:30
【问题描述】:

代码如下:

int main()
{   
    int* p = nullptr;
    const int* cp = p;
    const int*& ref = cp;
    const int*& ref0 = cp;
    const int*& ref1 = p;//not allowed
    const int*& ref2 = static_cast<const int*&>(p);//not allowed
    int* const & ref3 = p;//allowed. Why?
    return 0;
}

当我运行它时,我得到了

test.cpp:7:14: error: non-const lvalue reference to type 'const int *' cannot
      bind to a value of unrelated type 'int *'
        const int*& ref1 = p;
                    ^      ~
test.cpp:8:21: error: non-const lvalue reference to type 'const int *' cannot
      bind to a value of unrelated type 'int *'
        const int*& ref2 = static_cast<const int*&>(p); 

我很难理解为什么。也许const 在这里发挥了作用。而当我写const int*&amp;int* const &amp; 时,我不知道const 适用于指针或引用。 const int* const &amp; 也让我感到困惑。 我想知道以下项目的语法:

对 const 指针的引用。

对指向 const 的指针的引用。

对一个 const 指针的引用并指向一个 const。

和 const 参考版本:

对指针的 const 引用。

对 const 指针的 const 引用。

对指向 const 的指针的 const 引用。

对一个 const 指针的 const 引用,该指针指向一个 const。

对不起,我的困惑。

【问题讨论】:

  • 名为ref的变量实际上并不是一个引用,它是一个指针。
  • @Eljay 抱歉输入错误。我已经更正了。
  • 因为const 不具有传递性,所以这是两种不同的类型:const int*int *。因此,当您将引用绑定到指针时,引用的类型必须与所引用事物的类型相匹配。根据您的最后一个示例,可以对非常量指针进行 const 指针引用。请记住,指针本身就是一个值,因为您似乎将指针视为值以外的东西。

标签: c++ pointers reference constants


【解决方案1】:

您的p 是指向int 的指针。 const int*&amp; 是对指向 const int 的指针的引用。由于pint 而不是const int,因此您不能将应该引用指向const int 的指针的引用绑定到引用p

在 C++ 中阅读声明的关键是“从内到外”阅读它们,即从标识符(名称)开始,然后按自己的方式进行阅读。举个例子:

int* const & ref3;

是对 const 指针的引用,该指针指向 int。我们从标识符 (ref3) 开始向外工作。我们找到的第一件事是&amp;。所以ref3 是一个参考。接下来是const,所以无论ref3 指的是const 的东西。接下来是*,所以引用所指的const 是一个指针。最后是int,我们正在处理对const 指向int 的指针的引用。

请注意,标识符的两侧可能会发生一些事情。在“解决问题”时,您必须考虑哪些说明符/操作符首先/更牢固地绑定以确定声明的类型。例如:

int const * a[10];

同样,我们从标识符 a 开始。 [] 的绑定比 * 更强,所以 a 是一个包含 10 个元素的数组。 a 是一个数组的这些元素是什么?接下来是*,所以a 是一个包含10 个指针的数组。最后,我们发现a是一个包含10个指向constint的指针的数组。请注意,如果最后剩下一个孤独的const,那么const 将绑定到它之前的任何内容。这就是为什么我们也可以写const int a,它相当于int const a

您还可以使用括号来影响运算符在声明中生效的顺序。例如

int const (* a)[10];

将是指向 10 个 const int 的数组的指针,而不是指向 const int 的 10 个指针的数组。

【讨论】:

  • 谢谢!真的帮了大忙。您能否给我一些与 1.A const 引用 const 指针相关的额外实现示例。 2. 对指向 const 的指针的 const 引用。 3. 对 const 且指向 const 的指针的 const 引用。 ?太感谢了!我只是想确保我明白你的意思。
  • 我很乐意添加更多示例。但是,您请求的所有示例似乎都要求引用 const。澄清这一点:你可以有一个引用是 const 的东西,但引用本身不能是 const,因为那没有意义。引用本身并不是真正的对象,它们只是引用另一个对象。它们必须在初始化时绑定到现有对象,并且不能更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 2022-06-14
  • 2015-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多