2016-05-03 2863 views
2

考虑下面的代码:输入参数类型“const double *&”是什么意思?

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*),我可以修改指针指向的地址(但我不能修改指针指向的double至)。

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

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

+3

'const double *&'means'引用'const double *'“。你已经知道后者的意思了,因为你只是描述了它:这意味着尽管指针可以被修改,但指向的东西不可能。 –

+0

[void(\ *(\ * f \ [\])())()](http://stackoverflow.com/questions/34548762/void-f) –

+3

另外:[cdecl.org](如果不确定声明的含义,那么它是好的。 –

回答

4

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

您可能需要使用任一double* const(这是一个常量指针为[非const]双)或double* const&(这是一个常量指针的引用[非const]双)。

3
const double*& x 

意味着x是一个指针引用一个const双,这意味着该对象不能被修改(即,被const类型限定符附接到double,而不是指针对象本身在这种情况下)

+0

谢谢你的回答,我很怀疑。但令我困惑的是,虽然'const double *&'是一个指向const double的指针,'const double&'不是对const double的引用。这怎么能被理解?就顺时针螺旋规则而言?还有别的吗? – andreasdr

+1

@andreasdr'const double&'是对const double的引用。 –

+0

我开始意识到我的误解。谢谢! – andreasdr

2

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

当您通过double*时,需要将其转换为const double*,这是一个临时变量,不能绑定到非const引用,这就是编译器抱怨的原因。

BTW:const double* const & x是对const double*的常量引用。

+0

谢谢,但关于你的最后一点,是不是一个const指针指向const double的引用?尽管搞清楚什么'const'坚持到“让我感到困惑不已,这就是http://cdecl.org/ – andreasdr

+1

@andreasdr建议的解释是的,精确的语句应该是”引用const指针到const double“ 。由于没有“非const引用”,可以在初始化后将其重新映射到其他的东西,所以我们对“引用const”引用“const引用”,对“引用非const”引用“非const引用”。是的,这令人困惑...... – songyuanyao

相关问题