【问题标题】:Const confusion in C++ [duplicate]C ++中的常量混淆[重复]
【发布时间】: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> 标签来格式化您的代码。使用提供的代码格式化按钮。

标签: c++ pointers compiler-construction constants


【解决方案1】:

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

const int a = 5;
int b = a;

这(您可能知道)完全有效,因为它创建了变量的副本。如果你做b = 10a 仍然是 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 的文章。它涵盖了所有可能的场景以及它们在简单英语中的含义。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-20
            • 2016-07-08
            • 2023-03-12
            • 2014-03-28
            相关资源
            最近更新 更多