c++ - 不明白为什么 const 限定符被丢弃

标签 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 {
            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)。

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

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

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

关于c++ - 不明白为什么 const 限定符被丢弃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36280955/

相关文章:

c++ - 涉及 const_cast 的意外行为

c++ - 如何在 C++ 中为指针分配常量地址?

c++ - 为什么 std::is_same 对这两种类型给出不同的结果?

c++ - 创建范围自定义内存池/分配器?

c++ - 从成员函数类型中删除 const 的特征?

c++ - 在 C++ 中将函数指针中的 const 参数转换为非 const

Haskell 最小/最大双常数

c++ - LinkedStack 及其模板类

C++ 如何在不尝试 {} finally{} 的情况下安全地关闭文件?

c++ - Boost asio tcp,为什么我不能在服务器端只有一个可以打开和关闭的数据套接字