嗨,我对特定的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背后的含义是完全不同的,所以似乎不应该有这种隐式转换。这是编译器的问题(不太可能),或者我对这里涉及的常数的理解(很可能)。
答案 0 :(得分:8)
您所做的相当于以下内容:
const int a = 5;
int b = a;
这是(正如您可能知道的)完全有效,因为它创建了变量的副本。如果你执行b = 10
,a
仍为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的文章。它涵盖了所有可能的场景以及它们用简单的英语表达的含义。