Increment/decrement operators
インクリメント/デクリメント演算子はオブジェクトの値をインクリメントまたはデクリメントします。
| 演算子名 | 構文 | オーバーロード可能 | プロトタイプ例 ( class T の場合) | |
|---|---|---|---|---|
| クラス定義内 | クラス定義外 | |||
| 前置インクリメント |
++a
|
可 | T & T :: operator ++ ( ) ; | T & operator ++ ( T & a ) ; |
| 前置デクリメント |
--a
|
可 | T & T :: operator -- ( ) ; | T & operator -- ( T & a ) ; |
| 後置インクリメント |
a++
|
可 | T T :: operator ++ ( int ) ; | T operator ++ ( T & a, int ) ; |
| 後置デクリメント |
a--
|
可 | T T :: operator -- ( int ) ; | T operator -- ( T & a, int ) ; |
|
||||
目次 |
前置演算子
前置インクリメントおよびデクリメント式の形式は以下の通りです
++
式
|
|||||||||
--
式
|
|||||||||
組み込み前置演算子
|
(C++17まで) |
|
(C++17以降) |
|
(C++20以降) |
- expression の型が(possibly cv-qualified) bool の場合、プログラムは不適格です。
|
(C++20以降) |
オーバーロード
ユーザー定義演算子に対するオーバーロード解決
において、
bool
以外の任意のオプションでvolatile修飾された算術型
A
および、オプションでcv修飾されたオブジェクト型へのオプションでvolatile修飾されたポインタ
P
ごとに、以下の関数シグネチャがオーバーロード解決に参加します:
|
A
&
operator
++
(
A
&
)
|
||
|
bool
&
operator
++
(
bool
&
)
|
(非推奨) (C++17まで) | |
|
P
&
operator
++
(
P
&
)
|
||
|
A
&
operator
--
(
A
&
)
|
||
|
P
&
operator
--
(
P
&
)
|
||
後置演算子
後置インクリメントおよびデクリメント式は次の形式を持ちます
式
++
|
|||||||||
式
--
|
|||||||||
組み込み後置演算子
後置インクリメントまたはデクリメントの結果は、 lvalue-to-rvalue conversion を expression (変更前)に適用して得られる値です。結果の型は、 expression の型のcv-unqualified版です。
expression が算術型の変更可能な左値でない場合 ((possibly cv-qualified) bool を除く) (C++17以降) 、または完全オブジェクト型へのポインタでない場合、プログラムは不適格です。
|
expression の型がvolatile修飾されている場合、インクリメントまたはデクリメントは非推奨です。 |
(C++20以降) |
++
演算子のオペランドであるかのように変更されます。
--
演算子のオペランドであるかのように変更されます。
後置インクリメントまたはデクリメントの値計算は、 sequenced before expression の変更よりも前に順序付けられます。不定順序関数呼び出しに関して、後置インクリメントまたはデクリメントの操作は単一の評価です。
オーバーロード
ユーザー定義演算子に対するオーバーロード解決
において、
bool
以外の任意のオプションでvolatile修飾された算術型
A
および、オプションでcv修飾されたオブジェクト型へのオプションでvolatile修飾されたポインタ
P
ごとに、以下の関数シグネチャがオーバーロード解決に参加します:
|
A operator
++
(
A
&
,
int
)
|
||
|
bool
operator
++
(
bool
&
,
int
)
|
(非推奨) (C++17まで) | |
|
P operator
++
(
P
&
,
int
)
|
||
|
A operator
--
(
A
&
,
int
)
|
||
|
P operator
--
(
P
&
,
int
)
|
||
例
#include <iostream> int main() { int n1 = 1; int n2 = ++n1; int n3 = ++ ++n1; int n4 = n1++; // int n5 = n1++ ++; // error // int n6 = n1 + ++n1; // undefined behavior std::cout << "n1 = " << n1 << '\n' << "n2 = " << n2 << '\n' << "n3 = " << n3 << '\n' << "n4 = " << n4 << '\n'; }
出力:
n1 = 5 n2 = 2 n3 = 4 n4 = 4
注記
副作用が関与するため、組み込みのインクリメントおよびデクリメント演算子は、 シーケンス規則 への違反による未定義動作を避けるために注意して使用する必要があります。
オブジェクトの一時的なコピーが後置インクリメントおよび後置デクリメント中に構築されるため、返される値が使用されないコンテキストでは通常、前置インクリメントまたは前置デクリメント演算子の方が効率的です。
標準ライブラリ
インクリメント演算子とデクリメント演算子は多くの標準ライブラリ型でオーバーロードされています。特に、すべての LegacyIterator は operator ++ をオーバーロードし、すべての LegacyBidirectionalIterator は operator -- をオーバーロードします。たとえそれらの演算子が特定のイテレータに対してno-opであっても同様です。
算術型に対するオーバーロード |
|
|
アトミック値を1増加または減少させる
(
std::atomic<T>
の公開メンバ関数)
|
|
|
ティックカウントを増加または減少させる
(
std::chrono::duration<Rep,Period>
の公開メンバ関数)
|
|
イテレータ型に対するオーバーロード |
|
|
イテレータを進める
(
std::raw_storage_iterator<OutputIt,T>
の公開メンバ関数)
|
|
reverse_iterator
を進めるまたは戻す
(
std::reverse_iterator<Iter>
の公開メンバ関数)
|
|
move_iterator
を進めるまたは戻す
(
std::move_iterator<Iter>
の公開メンバ関数)
|
|
|
何もしない(no-op)
(
std::front_insert_iterator<Container>
の公開メンバ関数)
|
|
|
何もしない(no-op)
(
std::back_insert_iterator<Container>
の公開メンバ関数)
|
|
|
何もしない(no-op)
(
std::insert_iterator<Container>
の公開メンバ関数)
|
|
|
イテレータを進める
(
std::istream_iterator<T,CharT,Traits,Distance>
の公開メンバ関数)
|
|
|
何もしない(no-op)
(
std::ostream_iterator<T,CharT,Traits>
の公開メンバ関数)
|
|
|
イテレータを進める
(
std::istreambuf_iterator<CharT,Traits>
の公開メンバ関数)
|
|
|
何もしない(no-op)
(
std::ostreambuf_iterator<CharT,Traits>
の公開メンバ関数)
|
|
|
次のマッチにイテレータを進める
(
std::regex_iterator<BidirIt,CharT,Traits>
の公開メンバ関数)
|
|
|
次のサブマッチにイテレータを進める
(
std::regex_token_iterator<BidirIt,CharT,Traits>
の公開メンバ関数)
|
|
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| CWG 2855 | C++98 |
組み込みの前置インクリメントと前置デクリメントには通常の算術変換が適用されるが、
後置版には適用されなかった [1] |
同様に適用 |
| CWG 2901 | C++98 |
組み込みの後置インクリメントと後置デクリメントに
左辺値から右辺値への変換が適用されなかった |
適用 |
- ↑ 前置 ++ x は x + = 1 と等価であり、後者は通常の算術変換(すなわち decltype ( x ) と int の共通型を生成する)が適用可能です。しかしながら、後置 x ++ の効果は単に「 x に1を加算する」というものであり、二項演算子が存在しないため、通常の算術変換は行われません。
関連項目
| 共通演算子 | ||||||
|---|---|---|---|---|---|---|
| 代入 |
インクリメント
デクリメント |
算術 | 論理 | 比較 |
メンバー
アクセス |
その他 |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
...
]
|
関数呼び出し
a ( ... ) |
|
カンマ
a, b |
||||||
|
条件演算子
a ? b : c |
||||||
| 特殊演算子 | ||||||
|
static_cast
関連する型間での変換を行う
|
||||||
|
C documentation
for
Increment/decrement operators
|
|
C documentation
for
インクリメント/デクリメント演算子
|