【问题标题】:const qualifier disappears from pure virtual function [duplicate]const 限定符从纯虚函数中消失[重复]
【发布时间】:2014-08-09 01:19:01
【问题描述】:

使用 gcc 4.8.2 版:

我遇到了一个问题,当我编译我的代码时,我的参数上的 const 限定符消失了。这是一个例子:

main.cc:

#include <iostream>

class Base
{
        public:
        virtual int getSum( const int number ) = 0;
};

class Derived : public Base
{
        public:
        Derived( const int& num )
        : _myNumber( num )
        {}

        virtual int getSum( const int number )
        {
                return _myNumber + number;
        }

        private:
        int _myNumber;
};

int main( int argc, const char* argv[] )
{
        Base *b = new Derived( 2 );

        std::cout << b->getSum( 3 ) << "\n";

}

编译如下:

g++ main.cc -o const_test

当我运行 nm 时:

nm const_test | c++filt | grep getSum

我得到以下输出:

0000000000400b60 W Derived::getSum(int)

为什么编译时 const 会从我的函数中消失?

【问题讨论】:

  • @πάνταῥεῖ 更准确地说,它一个含义(在函数内部),但它不是签名的一部分。
  • @Konrad Rudolph 把它写下来作为答案。
  • 这是一个语言规则,函数参数上的 cv 限定符被忽略以进行重载解析。 C++ 语言规范第 13.1 节。

标签: c++ constants pure-virtual


【解决方案1】:

你的函数签名

virtual int getSum(const int number) = 0;

实际上完全等同于

virtual int getSum(int number) = 0;

const 对值传递参数的函数签名声明没有影响。

唯一的影响是,您不能在此方法的潜在定义内更改堆栈上的参数实例。实际上,仅将其放在那里就足够了,以防止更改函数体中的参数实例。

【讨论】:

  • 可能值得补充一点,重要的是函数定义中的签名。你提到这两个签名是相同的,但有时人们不明白这意味着什么。
  • @juanchopanza THX 指出,我试图澄清这一点。
猜你喜欢
  • 2012-03-20
  • 2012-08-27
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 2011-07-25
  • 2011-03-29
  • 2021-10-20
相关资源
最近更新 更多