戻り値の型をconst MyClass * const
にしようとしています。しかし、私は警告を受け取ります:返品の種類が意味をなさないのはなぜですか?
警告:戻り値の型の修飾子は無意味です。
これは有効なタイプではありませんか?私はポインタを変更することができないよりも欲しいし、ポインタが指しているものも変更しないようにしたい。
戻り値の型をconst MyClass * const
にしようとしています。しかし、私は警告を受け取ります:返品の種類が意味をなさないのはなぜですか?
警告:戻り値の型の修飾子は無意味です。
これは有効なタイプではありませんか?私はポインタを変更することができないよりも欲しいし、ポインタが指しているものも変更しないようにしたい。
を返しているので、ポインタ自体が値型を持っているので、それはそれのconstにする意味がないものを意味するものではありません。呼び出し元関数が戻り値で行うことは、呼び出された関数によって制限できません。 、この場合には、単にint値(ない参照)を返します)
const int getInt();
のgetInt(:これは何かを定義しようとしているに似ています。それはレジスタに行き、呼び出し元関数はそれを受け取り、それが望むものを何でもします。
のconst修飾子は、ポインタ
なぜポインタが変更されても気になりませんか?これを行うと言うようなものです:
const int f() {
...
}
fで返される値は、()のコピーである - それは何も変わらない変え、そのNOMのポイントは、それのconstを作るのがあります。
私は、個々のオブジェクトのサイズが同じではないので、人々がポインタ++のようなことをしたくないと思っていました。 – Dynite
@Dyniteこれは、人々にあなたの住所、例えば80、メインストリートを与えて、メインストリートの81番に鐘を鳴らすとどうなるのだろうと思います。 –
@Dynite - ダニエルが指摘しているように、とにかくそれをやることができるので、余分なキーボード演習を除いて何も得られません。 –
戻り値の型を定義していることを確認する簡単な方法の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
:)
私はあなたが、ポインタの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();
なぜ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戻り値に代入することは明らかです。
どのコンパイラフラグとコンパイルフラグを使用していますか? – Trent
RVCT 3.1と私は、ビルドシステムのフラグの勇気が私たちから隠されているのは分かりません – Dynite