C ++中的常量混淆[重复]
Posted
技术标签:
【中文标题】C ++中的常量混淆[重复]【英文标题】:Const confusion in C++ [duplicate] 【发布时间】:2010-08-22 00:32:43 【问题描述】:可能重复: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 背后的含义大相径庭,所以似乎不应该有这种隐式转换。那么这是编译器的问题(不太可能),还是我对这里涉及的 const-ness 的理解(很可能)。
【问题讨论】:
请不要使用<code>
标签来格式化您的代码。使用提供的代码格式化按钮。
【参考方案1】:
您所做的相当于以下内容:
const int a = 5;
int b = a;
这(您可能知道)完全有效,因为它创建了变量的副本。如果你做b = 10
,a
仍然是 5,所以 constness 不会“被破坏”。
【讨论】:
【参考方案2】:正如在许多其他问题中多次提出的那样,从函数返回 const
值是没有意义的。函数返回一个右值,根据定义,它不能被修改。您可以将其分配给另一个变量这一事实并不令人惊讶。查看这些问题和答案以了解更多信息:
【讨论】:
“从函数返回 const 值是没有意义的”——这仅适用于内置类型。对于类类型,返回 const 或非 const(甚至按值)确实会有所不同。【参考方案3】:返回值不能修改。也就是说,指针不能被修改。但是,因为在调用站点,返回值是一个右值(没有定义=
运算符),所以无论如何都不能修改它。
如果返回值是左值(例如引用),这将是可能的:
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这种情况下的变化)。
【讨论】:
【参考方案4】:您始终可以将 X const
(常量 X)分配给变量 X —— 变量稍后可能会被修改,但 X const
保证自身不会' t 被修改,当然不是它的任何 副本 永远不会被修改。在你的情况下 X 是一个指针类型,但这不会改变这个规则。
您始终可以从 X*
值中分配一个 const X*
变量:指向的数据不会被修改通过您分配的指针变量(这就是 它的 const
的意思),但当然可以通过其他途径对其进行修改。
因此,在这种情况下,您同时进行了两个完全合法的分配:在这种情况下,没有理由说明这两个合法事物的组合应该是非法的,因为无论如何都没有违反明确的约束。
【讨论】:
【参考方案5】:使用左右规则来理解 'foo' 的返回类型。 'foo' 基本上返回一个(也通过 cdecl.org 交叉验证)
指向双精度的常量指针
“const 指向 double 的指针”与“指向 const double 的指针”不同。
第一种情况,指针是const,指向的值可以改变。
第二种情况,点可以改变,指向的值不能改变。
【讨论】:
【参考方案6】:嘿 jdowner,虽然这里的这些答案很可能回答了你的问题,但我也强烈建议你阅读这篇关于 const correctness 的文章。它涵盖了所有可能的场景以及它们在简单英语中的含义。
【讨论】:
以上是关于C ++中的常量混淆[重复]的主要内容,如果未能解决你的问题,请参考以下文章