// 后置++,返回自增前的值,且返回的是一个右值 const int operator++(int){ int temp(*this); *this += 1; return temp; }
我是在看一本书上看到的,返回类型是const的,随后百度看了下,发现大家博客写的大多也是返回const,我有点想不通,为何?去掉const又何妨呢?
业精于勤,荒于嬉;行成于思,毁于随。
クラスの作成者は、返された結果が値としてのみ使用され、結果をオブジェクトとして変更することはできないことを強調するためにこれを作成しました。 const を削除すると、この制限はなくなります。たとえば、コンパイラーによってブロックされずに cout << (a++).modify() を作成できます。
const
cout << (a++).modify()
C++11 以降:
組み込みのポストインクリメント式は prvalue です。この標準では、非クラス、非配列の prvalue は const/volatile 変更されないことが規定されています。 int Operator++(int); を呼び出すと prvalue になります。この戻り値の型に const を追加するのは冗長です (本ではランダムに記述されている可能性があります)。一般に、演算子のオーバーロードは組み込みバージョンの演算子と同様のセマンティクスを維持する必要があるため、それを prvalue に追加するだけです。
prvalue が非 const メンバー関数を呼び出さないようにするには、automodify() &;
const で変更された prvalue は、移動セマンティクスの防止など、非 const rvalue 参照と一致しません。これは、ほとんどの場合、実行時のオーバーヘッドが追加されるだけです。 const 値を返すことは廃止されました。
私は長い間 C++ を書いていなかったので忘れていましたが、例を示します 1++; int a = 2; a++++;
1++; int a = 2; a++++;
クラスの作成者は、返された結果が値としてのみ使用され、結果をオブジェクトとして変更することはできないことを強調するためにこれを作成しました。
const
を削除すると、この制限はなくなります。たとえば、コンパイラーによってブロックされずにcout << (a++).modify()
を作成できます。C++11 以降:
組み込みのポストインクリメント式は prvalue です。この標準では、非クラス、非配列の prvalue は const/volatile 変更されないことが規定されています。 int Operator++(int); を呼び出すと prvalue になります。この戻り値の型に const を追加するのは冗長です (本ではランダムに記述されている可能性があります)。一般に、演算子のオーバーロードは組み込みバージョンの演算子と同様のセマンティクスを維持する必要があるため、それを prvalue に追加するだけです。
prvalue が非 const メンバー関数を呼び出さないようにするには、automodify() &;
などの ref-qualifier を使用してください。const で変更された prvalue は、移動セマンティクスの防止など、非 const rvalue 参照と一致しません。これは、ほとんどの場合、実行時のオーバーヘッドが追加されるだけです。 const 値を返すことは廃止されました。
私は長い間 C++ を書いていなかったので忘れていましたが、例を示します
1++; int a = 2; a++++;