【问题标题】:C++ returning a non-const method in a const methodC++ 在 const 方法中返回非常量方法
【发布时间】:2016-02-17 15:09:30
【问题描述】:

我遇到了这个奇怪的问题

我有一个本身就是 const 的方法:

void doSomething() const { x(); } 和 x 是一个非常量方法。
编译会导致discards qualifiers 错误。

假设我将doSomething 转换为int,并让x 返回一些虚拟整数,它变成:

int doSomething() const { return x(); }

编译正常吗?它确实在我的编译器上编译,这让我认为这可能是一个编译器错误。

编译器版本为:gcc (Debian 4.4.5-8) 4.4.5


class GgWp
{
public:
    int doSomething const { return x(); }
    int x()
    {
        num = 5;
        return 0;
    }
private:
    int num;
}

如你所见,x 修改了变量num

【问题讨论】:

  • 不,这应该给出相同的错误,但它不太可能是编译器错误。请提供一个完整的例子来说明问题。
  • 上面编辑的代码 sn-p 不可能是你的实际代码,因为doSomething 缺少()
  • x 是否真的修改了任何东西都没有关系,标记为const 的成员函数根本无法调用未标记为const 的成员函数。
  • 您的示例无法编译(在doSomething 之后缺少())。请提供mvce 并确保它确实可以编译。
  • ideone.com/B5uwIR 未编译并出现预期错误。为什么会编译?

标签: c++11 constants


【解决方案1】:

考虑这一行:

int doSomething() const { return x(); }

如果x() 是一个成员函数,那么它必须是const,否则它将无法在任何主要的符合标准的编译器上编译。这与您是否实际返回 x() 的值或是否从 doSomething() 返回任何值无关。您不能从 const 函数运行非 const 函数。

如果x() 不是成员函数,则不适用。

【讨论】:

  • 是的。所以这就是我的答案。我提供的代码确实没有编译
【解决方案2】:

const之后函数名指的是对象(this) ,所以你应该不能从const方法调用x()(如果x不是const),返回类型应该没有区别。

如果它仍然编译,要么x() 不是成员,要么是const,或者 您的编译器出现故障。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    相关资源
    最近更新 更多