2009-03-26 19 views
11

戻り値の型をconst MyClass * constにしようとしています。しかし、私は警告を受け取ります:返品の種類が意味をなさないのはなぜですか?

警告:戻り値の型の修飾子は無意味です。

これは有効なタイプではありませんか?私はポインタを変更することができないよりも欲しいし、ポインタが指しているものも変更しないようにしたい。

+0

どのコンパイラフラグとコンパイルフラグを使用していますか? – Trent

+1

RVCT 3.1と私は、ビルドシステムのフラグの勇気が私たちから隠されているのは分かりません – Dynite

答えて

22

を返しているので、ポインタ自体が値型を持っているので、それはそれのconstにする意味がないものを意味するものではありません。呼び出し元関数が戻り値で行うことは、呼び出された関数によって制限できません。 、この場合には、単にint値(ない参照)を返します)

const int getInt(); 

のgetInt(:これは何かを定義しようとしているに似ています。それはレジスタに行き、呼び出し元関数はそれを受け取り、それが望むものを何でもします。

+0

したがって、基本的にconst戻り値の型は参照でのみ定義できますか? – Dynite

+0

はい(参照によって、参照と指し示されたオブジェクトの両方を意味します)。ポインタそのものはconstにすることはできません。それはちょうど周囲にコピーされた値です。 – Juliano

+0

関数から返されたときにポインタをconstにすることはできませんが、コールサイトでconstポインタを使用することができます(下記の私の答えを参照)。これにより、実際にポインターを使用しているときに誤ってポインターに再割り当てすることを防ぐことができます。 –

0

のconst修飾子は、ポインタ

4

なぜポインタが変更されても気になりませんか?これを行うと言うようなものです:

const int f() { 
    ... 
} 

fで返される値は、()のコピーである - それは何も変わらない変え、そのNOMのポイントは、それのconstを作るのがあります。

+0

私は、個々のオブジェクトのサイズが同じではないので、人々がポインタ++のようなことをしたくないと思っていました。 – Dynite

+3

@Dyniteこれは、人々にあなたの住所、例えば80、メインストリートを与えて、メインストリートの81番に鐘を鳴らすとどうなるのだろうと思います。 –

+0

@Dynite - ダニエルが指摘しているように、とにかくそれをやることができるので、余分なキーボード演習を除いて何も得られません。 –

4

戻り値の型を定義していることを確認する簡単な方法の1つは、元の型の右側(左側とは反対側)に常に修飾子を追加することです。

あなたの戻り値の型が再び無意味されることはありません確認して助けるべき
MyClass     // MyClass object 
MyClass const   // MyClass object which can't be modified 
MyClass const &   // reference of an unmodifiable MyClass object 
MyClass const *   // pointer to an unmodifiable MyClass object 
MyClass const * const // unmodifiable pointer to an unmodifiable MyClass object 
MyClass const * const & // reference of an unmodifiable pointer to an unmodifiable MyClass object 

:)

+1

"ポインタは変更できません。ポインタが指しているものも変更しないでください"という質問から。彼は彼の意図に基づいて戻り値の型を正しく宣言しました。 – Trent

+0

はい、彼はしました。そして彼は戻り値の上にこの物の無意味について警告するコンパイラだけを得ました。 – dragonfly

5

私はあなたが、ポインタのconst性が呼び出しサイトでなりたい、ジュリアーノの答えに同意します。あなたが探しているものを行うには良い方法は、あなたの関数はオブジェクトへのconst参照を返すことです

:定義参照することにより

const MyClass& getMyClass() 
{ 
    return myClass; 
} 

を変更することはできませんので、あなたがたほうが良いと思います。

あなたの関数がにMyClassオブジェクトを作成しようとすると、もちろんこれは機能しません。その場合、追加のconstをコールサイトに移動するだけで済みます。

// function definition 
const MyClass* createMyClass() 
{ 
    return new MyClass("I Love C++"); 
} 

// use of a const pointer to a MyClass which is const 
const MyClass* const myClassInstance = creatMyClass(); 
0

なぜconst値を返すのですか?次のことを考えてみましょう(と想像力に欠ける変数名を言い訳してください):

struct A { int a; }; 

A operator+(const A& a1, const A& a2) 
{ 
    A a3 = { a1.a + a2.a }; 
    return a3; 
} 

operator+のその宣言を考えると、私は次の操作を行うことができます:そうですね

A a = {2}, b = {3}, c = {4}, d = ((a+b) = c); 

は、私はちょうど一時的Aに割り当てられていますoperator+によって返されました。結果値d.aは5ではなく4です。operator+の戻り値の型をconst Aに変更すると、この割り当てができなくなり、式(a+b) = cにコンパイラエラーが発生します。

関数から返されたポインタまたは整数に代入しようとすると、私のコンパイラ(MSVC)は "左側のオペランドはl値でなければなりません"というエラーを生成します。ポインタは無意味です - ポインタはとにかく割り当てることができません。しかし、クラス/構造体の場合、非const戻り値に代入することは明らかです。

関連する問題