C ++中的const混淆

时间:2010-08-22 00:32:43

标签: c++ pointers compiler-construction const

  

可能重复:
  Why is my return type meaningless?

嗨,我对特定的const转换感到困惑。我有类似

的东西
// Returns a pointer that cannot be modified,   
// although the value it points to can be modified.  
double* const foo()  
{  
    static double bar = 3.14;  
    return &bar;  
}

int main()  
{  
    double* const x = foo(); // fine  
    const double* y = foo(); // eh?!  
    return 0;  
}

当我在MSVS 2008(Express)上编译它时,没有错误,但在我看来应该有。 x和y背后的含义是完全不同的,所以似乎不应该有这种隐式转换。这是编译器的问题(不太可能),或者我对这里涉及的常数的理解(很可能)。

6 个答案:

答案 0 :(得分:8)

您所做的相当于以下内容:

const int a = 5;
int b = a;

这是(正如您可能知道的)完全有效,因为它创建了变量的副本。如果你执行b = 10a仍为5,那么常量不会“破坏”。

答案 1 :(得分:3)

正如许多其他问题中许多其他问题一样,从函数中返回const值是没有意义的。函数返回一个rvalue,根据定义,它不能被修改。您可以将其分配给另一个变量这一事实并不令人惊讶。看看这些问题&答案了解更多信息:

答案 2 :(得分:1)

无法修改返回值。也就是说,指针无法修改。但是,因为在调用站点,返回值是一个右值(没有定义的=运算符),所以无论如何都不能修改它。

如果返回值是左值(例如参考值),则可能:

double* &foo()
{
    static double bar = 3.14;
    double *barP = &bar;
    return barP;
}

double myDouble;
foo() = &myDouble;

但这不可能:

double* const &foo()
{
    static double bar = 3.14;
    double *barP = &bar;
    return barP;
}

double myDouble;
foo() = &myDouble; // error!

const添加到返回值(将指针的质量添加为const,而将指向数据添加为const })在你的情况下什么都不做。如果有的话,你的编译器应该警告你这一点,因为如果你只是删除const限定符(除非可能的 ABI更改,除非我不确定标准是否允许),否则没有什么不同对于这种情况下的ABI变化。)

答案 3 :(得分:0)

你总是可以将一个X const,一个常数X赋给一个变量X--这个变量可能稍后会被修改,但是X const保证的是本身不会被修改,当然不会有任何副本永远不会被修改。在你的情况下,X是一个指针类型,但这不会改变这个规则。

您始终可以从const X*值分配X*变量:指向的数据不会通过您指定的指针变量修改(即 const意味着什么),但当然可以通过其他途径进行修改。

所以在这种情况下,你同时做了两个完全合法的任务:在这种情况下,没有理由为什么两个合法事物的组合应该是非法的,因为无论如何都没有违反表达的约束。

答案 4 :(得分:0)

使用左右规则来理解'foo'的返回类型。 'foo'基本上返回a(也通过cdecl.org交叉验证)

  

const指向double的指针

“指向double的const指针”与“指向const double的指针”不同。

在第一种情况下,指针是const,指向值可以改变。

在第二种情况下,点可以改变,指向的值不能改变。

答案 5 :(得分:0)

嘿jdowner,虽然这里的答案很可能回答你的问题,但我也强烈建议你阅读这篇关于const correctness的文章。它涵盖了所有可能的场景以及它们用简单的英语表达的含义。