【问题标题】:don't understand why const qualifiers are discarded [duplicate]不明白为什么 const 限定符被丢弃 [重复]
【发布时间】:2016-03-29 09:54:50
【问题描述】:

我知道这是一个简单的问题,但我已经用谷歌搜索了一段时间,从我的发现中我仍然不明白这个问题。 我有这个简单的代码:

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 $ 

【问题讨论】:

    标签: c++ constants


    【解决方案1】:

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

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

    所以你的函数的定义应该如下:

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

    【讨论】:

    • "由于它们是整数类型,它们是按值返回的,而不是按引用返回的,所以它们不需要 const 限定符。"我不同意 - 返回类型没有区别。您可以通过引用返回一个整数,然后 const 将完全有意义。
    • @LuchianGrigore 好的,句子改写了。
    • 这个答案很容易传达错误的印象。我不会投反对票,因为在所有合理的解释下它都不是不正确的,但我当然也不会投赞成票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多