1. ホーム
  2. c++

constオブジェクトを返すべきですか?

2023-08-31 07:31:26

質問

Effective C++ 項目03、可能な限りconstを使用する。

class Bigint
{
  int _data[MAXLEN];
  //...
public:
  int& operator[](const int index) { return _data[index]; }
  const int operator[](const int index) const { return _data[index]; }
  //...
};

const int operator[] との違いは int& operator[] .

しかし、どうでしょう。

int foo() { }

const int foo() { }

同じような感じですね。

私の疑問は、なぜ const int operator[](const int index) const の代わりに int operator[](const int index) const ?

どのように解決するのですか?

クラス型以外の戻り値のトップレベルの cv-qualifiers は無視されます。 つまり、たとえ

int const foo();

戻り値の型は int . 戻り値の型が参照である場合は、もちろん は const はもはやトップレベルではなく、その区別は

int& operator[]( int index );

int const& operator[]( int index ) const;

が重要です。 (上記のような関数宣言では,トップレベルのcv修飾子も無視されることに注意してください. のような関数宣言では,トップレベルのcv-qualifiersも無視されることに注意してください).

この区別は、クラス型の戻り値にも関係します。 を返す場合 T const を返した場合、呼び出し側はその返された値に対してconstでない関数を呼び出すことができません。 を返した場合、呼び出し側は、例えば

class Test
{
public:
    void f();
    void g() const;
};

Test ff();
Test const gg();

ff().f();             //  legal
ff().g();             //  legal
gg().f();             //  **illegal**
gg().g();             //  legal