g++: const discards qualifiers

2019-04-06 10:23发布

why do I get a discard qualifiers error:

customExc.cpp: In member function ‘virtual const char* CustomException::what() const’:
customExc.cpp: error: passing ‘const CustomException’ as ‘this’ argument of ‘char customException::code()’ discards qualifiers

on the following code example

#include <iostream>


class CustomException: public std::exception {

public:

    virtual const char* what() const throw() {
        static std::string msg;
        msg  = "Error: ";
        msg += code();  // <---------- this is the line with the compile error 
        return msg.c_str();
    }

    char code() { return 'F'; }
};

I have searched around on SOF before regarding simular issues.

I have already added a const on every possible place.

Please enlighten me - I don't get the point...

EDIT: here are the steps to reproduce on Ubuntu-Carmic-32bit (g++ v4.4.1)

  1. save example as customExc.cpp
  2. type make customExc.o

EDIT: The error is related to CustomException. The class Foo has nothing to do with it. So I have deleted it.

标签: c++ g++ const
4条回答
贼婆χ
2楼-- · 2019-04-06 10:48

CustomException::what calls CustomException::code. CustomException::what is a const method, as signified by the const after what(). Since it is a const method, it cannot do anything that may modify itself. CustomException::code is not a const method, which means that it does not promise to not modify itself. So CustomException::what can't call CustomException::code.

Note that const methods are not necessarily related to const instances. Foo::bar can declare its exc variable as non-const and call const methods like CustomException::what; this simply means that CustomException::what promises not to modify exc, but other code might.

The C++ FAQ has a bit more information on const methods.

查看更多
Fickle 薄情
3楼-- · 2019-04-06 10:58
   int code() const { return 42; }
查看更多
何必那么认真
4楼-- · 2019-04-06 10:59

Your what() is a const member function, but code() is not.

Just change code() to code() const.

查看更多
一纸荒年 Trace。
5楼-- · 2019-04-06 11:03

Your code() member function is not declared const. Calling non-const member functions from const member functions (what() in this case) is illegal.

Make your code() member const.

查看更多
登录 后发表回答