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 = 10a 仍然是 5,所以 constness 不会“被破坏”。

【讨论】:

【参考方案2】:

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

Should useless type qualifiers on return types be used, for clarity? Why is my return type meaningless? where is rvalue stored in c?

【讨论】:

“从函数返回 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 ++中的常量混淆[重复]的主要内容,如果未能解决你的问题,请参考以下文章

混淆:隐藏java中的硬编码值[重复]

混淆 C++ 语言中的字符串重复

根据第三列动态选择两列之一[重复]

数组是指针? [重复]

C中的无符号十六进制常量?

可变大小的位集[重复]