1. ホーム
  2. c++

gcc は "修飾語を破棄する [-fpermissive]" でコンパイルします。

2022-02-15 02:54:17
<パス
struct Base
{
    Base() { std::cout << " Base::Base()\n"; }
    virtual ~Base() { std::cout << " Base::~Base()\n"; }
    virtual void test() { std::cout << " test in base\n"; }
};

void MyTest(const Base& b)
{
    b.test();
}

以下のようなエラーでコンパイルします。
error: 'virtual void Base::test() ' の 'this' 引数として 'const Base' を渡すと修飾子 [-fpermissive] が破棄されます。
回避策
1. Base で test を宣言するときに const を追加する。

void test() const



2. MyTest の引数の前にある const 修飾子を削除します。
理由
C++では、const修飾された引数で参照されるオブジェクトは、そのオブジェクトのconst関数にしかアクセスできません。他の関数を呼ぶと、そのオブジェクトのメンバーを変更する可能性があり、コンパイラはそのようなことを避けるために非const関数を呼ぶのは間違いであると判断するためです。