【问题标题】:What does the input argument type "const double *&" mean?输入参数类型“const double *&”是什么意思?
【发布时间】:2016-08-28 14:54:18
【问题描述】:

考虑以下代码:

void func1(const double& x) {
    x = 1.2; //compilation error! (assignment of read-only reference)
}
void func2(const double* x) {
    *x = 1.3; //compilation error! (assignment of read-only location)
}
void func3(const double*& x) {
    *x = 1.4; //compilation error! (assignment of read-only location)
}
int main()
{
    double a = 1.1;
    func1(a);
    double *y = &a;
    func2(y);
    func3(y); //compilation error! (invalid initialization of reference of type 'const double*&' from expression of type 'double*')
    return 0;
}

在这里,我的理解是func1() 引用一个双精度,而func2() 使用一个指向双精度的指针。在这两种情况下,const 关键字意味着函数不能修改 double 的值。因此,我得到了预期的编译错误。

但是func3() 是怎么回事?对于这个输入参数类型的含义,我似乎找不到解释编译错误的解释。我假设const double*& x 的意思是“对double* 的引用,它不能被修改”。但这似乎是错误的解释:我不能发送double*(但我可以发送const double*)并且我可以修改指针指向的地址(但我不能修改@指针指向的987654332@)。

我想我的困惑来自对 const 关键字“附加”到:&? 的误解。到double*? const double*& x 的解释是什么可以消除我的困惑?

编辑:这个问题与建议的重复问题不同,因为它在很大程度上与如何解释 const 关键字“附加到”的内容有关。

【问题讨论】:

  • const double*& 表示“引用const double*”。你已经知道后者是什么意思了,因为你刚刚描述了它:它的意思是虽然指针可以修改,但指向的东西不能。
  • void ( *( *f[] ) () ) ()的可能重复
  • 另外:如果不确定声明的含义,cdecl.org 很好。

标签: c++ constants pass-by-reference


【解决方案1】:

const double*& 是对指向 const double 的指针的引用。所以 *x 是一个 const double,你不能这样赋值。 const 在此处附加到 double

您可能想要使用double* const(它是一个指向 [non-const] double 的 const 指针)或 double* const&(它是一个指向 [non-const] double 的 const 指针的引用)。

【讨论】:

    【解决方案2】:

    const double*& x,表示对const double*的非常量引用。

    当你传递一个double* 时,它需要被强制转换为const double*,这是一个临时变量,不能绑定到非常量引用,这就是编译器报错的原因。

    顺便说一句:const double* const & x 是对const double* 的常量引用。

    【讨论】:

    • 谢谢,但关于你的最后一点,这不是对指向 const double 的 const 指针的引用吗?虽然弄清楚const“坚持”什么让我困惑不已,但这是cdecl.org建议的解释
    • @andreasdr 是的,准确的说法应该是“引用 const 指针到 const double”。由于没有“非常量引用”,它可以在初始化后反弹到其他东西,所以我们说“常量引用”是“对常量的引用”,而“非常量引用”是“对非常量的引用”。是的,这令人困惑......
    【解决方案3】:
    const double*& x
    

    表示x 是对指向 const double 的指针的引用,这意味着对象不能被修改(即const 是附加到double 的类型限定符,而不是指针对象本身在此案例)

    【讨论】:

    • 感谢您的回答,我也很怀疑。但是让我感到困惑的是,const double*& 是对指向 const double 的指针的引用,const double& 不是对 const double 的引用。这怎么能理解?根据顺时针螺旋规则?还有什么?
    • @andreasdr const double& 是对 const double 的引用。
    • 我开始意识到我的误解是什么。谢谢!
    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2023-04-08
    相关资源
    最近更新 更多