2

クラスが所有する配列へのポインタを返したいのですが。ただし、ユーザーがそのデータまたはポインターを変更できるようにしたくありません。私が理解していることによると、次の構文を使用して、定数データへの定数ポインターを返す必要があります。

const Type *const Class::Method() {
    return this->data_; 
}

ただし、gccはコンパイル時に次の警告を出します。

警告:関数の戻り型で型修飾子が無視されます

この警告がgccによって提供されるのはなぜですか?どういう意味ですか?これが私が望むものに対して正しい構文ではない場合、何ですか?

4

3 に答える 3

2

あなたが得る警告は、決勝constが見落とされているためです。それを脱いで、あなたは準備ができています。

constデータへのポインタを返す必要はありません。データへのポインタ(つまり)constだけを返す必要があります。を返すことが意味をなさないのと同じように、値が新しい変数に割り当てられるとすぐに破棄されるため、を返すことは意味がありません。constconst Type*const intT* constconst

于 2013-03-03T04:48:43.860 に答える
1

組み込み型の場合、最上位constは無視されます。C ++ [3.14p4]にはルールがあるため、次のようになりますclass and array prvalues can have cv-qualified types; other prvalues always have cv-unqualified types.。あなたの場合、ポインタを作るconst Type* constトップレベルは無視されます。constconst

最後に追加できますconstconst Type * Class::Method() const {...}。これにより、メンバー関数内でポインターが変更されるのを防ぐことができます。ただし、メンバー関数は変更できないprvalueを返すため、クラス外のポインターメンバーの変更を防ぐためにこれを行う必要はありません(これが、このルールがC ++に存在する理由でもあります)。オブジェクトなどを常に参照して関数を呼び出したい場合に便利かもしれませんが、Class実行していることには、これは必要ないようです。

于 2013-03-03T04:32:56.950 に答える
0

最初のconstは正しいですが、2番目のconstは意味がありません。この例を見てください:

const int foo();
int a = foo();

この場合、fooがconst intまたは単にintを返す場合、何も変更されません。タイプ*についても同じです。

于 2013-03-03T04:32:07.320 に答える