C++ don';我不明白为什么常量限定符被丢弃

C++ don';我不明白为什么常量限定符被丢弃,c++,constants,C++,Constants,我知道这是一个简单的问题,但我在谷歌上搜索了一段时间,从我发现的情况来看,我仍然不理解这个问题。 我有一个简单的代码: class X { public: X() : x_(42) {}; virtual const long long f() const { return do_f(); } protected: virtual const long long do_f() const {

我知道这是一个简单的问题,但我在谷歌上搜索了一段时间,从我发现的情况来看,我仍然不理解这个问题。 我有一个简单的代码:

class X {
    public:
        X() : x_(42) {};
        virtual const long long f() const {
            return do_f();
        }
    protected:
        virtual const long long do_f() const {
            return x_;
        }
        long long x_;
};

auto main() -> int {
    X x;
    x.f();
}
我希望它能够编译,因为我不知道这些方法如何修改X的对象。 但显然我错过了一些东西,因为:

rakul@lucky-star /tmp $ g++ --std=c++14 -Werror=ignored-qualifiers 1.cpp        
1.cpp:6:37: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
         virtual const long long f() const {
                                     ^
1.cpp:10:40: error: type qualifiers ignored on function return type [-Werror=ignored-qualifiers]
         virtual const long long do_f() const {
                                        ^
cc1plus: some warnings being treated as errors
rakul@lucky-star /tmp $ 

您得到的常量错误与函数的
const
限定符(最后一个
const
)无关,而是与返回类型的
const
限定符(第一个
const
)有关

由于它们是整数类型,并且通过值而不是引用返回,因此它们不需要
const
限定符。这适用于由值返回的所有类型(内置或用户定义)

因此,函数的定义应如下所示:

    virtual long long f() const;
    virtual long long do_f() const;

您得到的常量错误与函数的
const
限定符(最后一个
const
)无关,而是与返回类型的
const
限定符(第一个
const
)有关

由于它们是整数类型,并且通过值而不是引用返回,因此它们不需要
const
限定符。这适用于由值返回的所有类型(内置或用户定义)

因此,函数的定义应如下所示:

    virtual long long f() const;
    virtual long long do_f() const;

“因为它们是整数类型,所以它们是通过值而不是引用返回的,所以它们不需要constqualifier。”我不同意-返回类型没有区别。您可以通过引用返回一个整数,然后
常量将完全有意义。@LuchianGrigore ok,句子重写。这个答案很容易传达错误的印象。我不是反对,因为在所有合理的解释下这都是正确的,但我当然也不是反对。“因为它们是整数类型,它们是通过值返回的,而不是通过引用返回的,所以它们不需要constqualifier。”我不同意-返回类型没有区别。您可以通过引用返回一个整数,然后
常量将完全有意义。@LuchianGrigore ok,句子重写。这个答案很容易传达错误的印象。我没有投反对票,因为这在所有合理的解释下都是正确的,但我当然也不会投反对票。