名前空間
変種
操作

明示的な型変換

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定 (C++20未満)
noexcept 指定子 (C++11)
例外
名前空間
指定子
decltype (C++11)
auto (C++11)
alignas (C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr (C++11)
ユーザ定義 (C++11)
ユーティリティ
属性 (C++11)
typedef 宣言
型エイリアス宣言 (C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
 
一般
値カテゴリ (lvalue, rvalue, xvalue)
評価順序 (副作用完了点)
定数式
未評価式
一次式
ラムダ式(C++11)
リテラル
整数リテラル
浮動小数点リテラル
ブーリアンリテラル
文字リテラル および エスケープシーケンス
文字列リテラル
ヌルポインタリテラル(C++11)
ユーザ定義リテラル(C++11)
演算子
代入演算子: a=b, a+=b, a-=b, a*=b, a/=b, a%=b, a&=b, a|=b, a^=b, a<<=b, a>>=b
インクリメントとデクリメント: ++a, --a, a++, a--
算術演算子: +a, -a, a+b, a-b, a*b, a/b, a%b, ~a, a&b, a|b, a^b, a<<b, a>>b
論理演算子: a||b, a&&b, !a
比較演算子: a==b, a!=b, a<b, a>b, a<=b, a>=b, a<=>b(C++20)
メンバアクセス演算子: a[b], *a, &a, a->b, a.b, a->*b, a.*b
その他の演算子: a(...), a,b, a?b:c
デフォルト比較(C++20)
演算子の代替表現
優先順位と結合性
畳み込み式(C++17)
new 式
delete 式
throw 式
alignof
sizeof
sizeof...(C++11)
typeid
noexcept(C++11)
演算子オーバーロード
変換
暗黙の変換
const_cast
static_cast
reinterpret_cast
dynamic_cast
明示的な変換 (T)a, T(a)
ユーザ定義変換
 

明示的な変換と暗黙の変換の組み合わせを用いて型の間で変換します。

目次

[編集] 構文

( 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 スタイルのキャスト記法は、不完全クラス型へのポインタからの/への/間のキャストが許されます。 expressionnew_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_typevoid (cv 修飾されていても構いません) の場合、式は結果のオブジェクトを持たない (C++17以上) void の prvalue です。
5) 単語1個の型名に波括弧初期化子リストが続いたものは、指定された波括弧初期化子リスト直接リスト初期化された一時オブジェクトを表す (C++17未満)オブジェクトを結果とする (C++17以上)指定された型の prvalue です。 new_typevoid (cv 修飾されていても構いません) の場合、式は結果のオブジェクトを持たない (C++17以上) void の prvalue です。 これは配列の prvalue を作成できる唯一のキャスト式です。
6,7) (2-5) と同じですが、最初にクラステンプレートの実引数推定を行います。

すべてのキャスト式と同様に、

  • new_type が左辺値参照型または関数への右辺値参照型の場合、結果は lvalue です。
  • new_type がオブジェクト型への右辺値参照型の場合、結果は xvalue です。
  • そうでなければ、結果は prvalue です。

[編集]

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 を追加または除去します[edit]
static_cast 変換 基本的な変換を行います[edit]
dynamic_cast 変換 チェック付きの多相的な変換を行います[edit]
reinterpret_cast 変換 一般的な低水準の変換を行います[edit]
標準変換 ある型から別の型への暗黙の変換[edit]
キャスト演算子C言語リファレンス