明示的な型変換
提供: cppreference.com
明示的な変換と暗黙の変換の組み合わせを用いて型の間で変換します。
目次 |
[編集] 構文
( new_type ) expression
|
(1) | ||||||||
new_type ( expression )
|
(2) | ||||||||
new_type ( expressions )
|
(3) | ||||||||
new_type ( )
|
(4) | ||||||||
new_type { expression-list(オプション) }
|
(5) | (C++11以上) | |||||||
template-name ( expressions(オプション) )
|
(6) | (C++17以上) | |||||||
template-name { expressions(オプション) }
|
(7) | (C++17以上) | |||||||
new_type
型の値を返します。
[編集] 説明
1) C スタイルのキャスト式に遭遇したとき、コンパイラはそれを以下のキャスト式として解釈しようと (この順序で) 試みます。
a)
const_cast
<new_type>(expression)。b)
static_cast
<new_type>(expression)。 ただし以下のような拡張が付きます。 派生クラスへのポインタまたは参照は、たとえ基底クラスがアクセス不可能であっても、曖昧でない基底クラスへのポインタまたは参照にキャストすることおよびその逆が追加的に許されます (つまり、このキャストは private 継承指定子を無視します)。 同じことがメンバポインタの曖昧でない非仮想基底のメンバポインタへのキャストに適用されます。c) static_cast (拡張付き) の後に const_cast が続いたもの。
d)
reinterpret_cast
<new_type>(expression)。e) reinterpret_cast の後に const_cast が続いたもの。
各キャスト演算子の要件を満たす最初の選択肢が選択されます (たとえコンパイルできなくとも (例を参照してください))。 キャストが
static_cast
の後に const_cast
が続いたものとして2通り以上に解釈できる場合は、コンパイルできません。 さらに、 C スタイルのキャスト記法は、不完全クラス型へのポインタからの/への/間のキャストが許されます。 expression と new_type の両方が不完全クラス型へのポインタの場合、 static_cast と reinterpret_cast のどちらが選択されるかは未規定です。
2) 関数キャスト式は単純型指定子または typedef 指定子 (別の言い方をすると、単語1個の型名) の後に括弧で囲まれた単一の式が続いたものから構成されます (unsigned int(expression) や int*(expression) は有効ではありません)。 このキャスト式は対応する C スタイルのキャスト式と正確に同等です。
3) 括弧内に複数の式が存在する場合、 new_type は適切に宣言されたコンストラクタを持つクラスでなければなりません。 この式は expressions を用いて直接初期化された一時オブジェクトを表す (C++17未満)オブジェクトを結果とする (C++17以上) new_type 型の prvalue です。
4) new_type が非配列完全オブジェクト型を表す場合、この式はその型の一時オブジェクトを表す (C++17未満)オブジェクト (cv 修飾子が追加される場合があります) を結果とする (C++17以上) new_type 型の prvalue です。 new_type がオブジェクト型の場合、オブジェクトは値初期化されます。 new_type が
void
(cv 修飾されていても構いません) の場合、式は結果のオブジェクトを持たない (C++17以上) void の prvalue です。5) 単語1個の型名に波括弧初期化子リストが続いたものは、指定された波括弧初期化子リストで直接リスト初期化された一時オブジェクトを表す (C++17未満)オブジェクトを結果とする (C++17以上)指定された型の prvalue です。 new_type が
void
(cv 修飾されていても構いません) の場合、式は結果のオブジェクトを持たない (C++17以上) void の prvalue です。 これは配列の prvalue を作成できる唯一のキャスト式です。すべてのキャスト式と同様に、
- new_type が左辺値参照型または関数への右辺値参照型の場合、結果は lvalue です。
- new_type がオブジェクト型への右辺値参照型の場合、結果は xvalue です。
- そうでなければ、結果は prvalue です。
[編集] 例
Run this code
double f = 3.14; unsigned int n1 = (unsigned int)f; // C スタイルのキャスト。 unsigned int n2 = unsigned(f); // 関数キャスト。 class C1; class C2; C2* foo(C1* p) { return (C2*)p; // 不完全型から不完全型にキャストします。 } // この例の C スタイルのキャストは、たとえ reinterpret_cast としてなら動作するとしても、 // static_cast として解釈されます。 struct A {}; struct I1 : A {}; struct I2 : A {}; struct D : I1, I2 {}; int main() { D* d = nullptr; // A* a = (A*)d; // コンパイル時エラー。 A* a = reinterpret_cast<A*>(d); // これはコンパイルできます。 }
[編集] 参考文献
- C++11 standard (ISO/IEC 14882:2011):
- 5.2.3 Explicit type conversion (functional notation) [expr.type.conv]
- 5.4 Explicit type conversion (cast notation) [expr.cast]
- C++98 standard (ISO/IEC 14882:1998):
- 5.2.3 Explicit type conversion (functional notation) [expr.type.conv]
- 5.4 Explicit type conversion (cast notation) [expr.cast]
[編集] 関連項目
const_cast 変換 | const を追加または除去します |
static_cast 変換 | 基本的な変換を行います |
dynamic_cast 変換 | チェック付きの多相的な変換を行います |
reinterpret_cast 変換 | 一般的な低水準の変換を行います |
標準変換 | ある型から別の型への暗黙の変換 |
キャスト演算子 の C言語リファレンス
|