名前空間
変種
操作

「cpp/language/explicit」の版間の差分

提供: cppreference.com
< cpp‎ | language
(Use {{lc}}. Update links. Various fixes.)
 
(1人の利用者による、間の1版が非表示)
1行: 1行:
{{tr_note}}
+
{{title|explicit }}
{{title|explicit specifier}}
+
{{cpp/language/navbar}}
{{cpp/language/navbar}}
+
 
+
{{tr|コンストラクタと暗黙の型変換を許可していない{{mark since c++11}}変換演算子を指定します|Specifies constructors and {{mark since c++11}} conversion operators that don't allow implicit conversions}}
+
 
+
===構文===
+
 
{{sdsc begin}}
 
{{sdsc begin}}
{{sdsc | {{c|explicit}} {{spar|class_name}} ( {{spar|params}} ) }}
+
{{sdsc|
{{sdsc  | {{c|explicit operator}} {{spar|type}} ( ) {{mark since c++11}} }}
+
{{|explicit}}
 +
 +
{{|{{}}
 +
{{|explicit }} {{spar|}} {{}}
 +
}}
 
{{sdsc end}}
 
{{sdsc end}}
 +
 +
 +
 +
  
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 +
 
===例===
 
===例===
 
{{example|code=
 
{{example|code=
 
struct A
 
struct A
 
{
 
{
     A ( int ) {}
+
     A(int) { }
 
+
     operator int() const { return 0; }
+
     operator () const { return ; }
 
};
 
};
  
 
struct B
 
struct B
 
{
 
{
     explicit B(int) {}
+
     explicit B(int) { }
     explicit operator int() const { return 0; }
+
     explicit int
 +
() const { return ; }
 
};
 
};
  
 
int main()
 
int main()
 
{
 
{
    // A is has no explicit ctor / conversion, everything is fine
+
     A a1 = 1;
     A a1 = 1;
+
     A a2(2);
     A a2 ( 2 );
+
     A a3 {};
     A a3 { 3 };
+
     int
     int na1 = a1;
+
     int na2 = static_cast<int>( a1 );
+
+
na1 = a1;
    B b1 = 1; // Error: implicit conversion from int to B
+
     na2 = static_cast<>(a1);
     B b2 ( 2 ); // OK: explicit constructor call
+
 
     B b3 { 3 }; // OK: explicit constructor call
+
B b1 = 1; // :B
    int nb1 = b2; // Error: implicit conversion from B to int
+
     B b2(2); // :
     int nb2 = static_cast<int>( b2 ); // OK: explicit cast
+
     B b3 {}; // :
 +
int
 +
=
 +
b2; // :
 +
B
 +
     nb2 = static_cast<>(b2); //
 
}
 
}
 
}}
 
}}
  
[[de:cpp/language/explicit]]
+
deenesfritptruzh
[[en:cpp/language/explicit]]
+
[[es:cpp/language/explicit]]
+
[[fr:cpp/language/explicit]]
+
[[it:cpp/language/explicit]]
+
[[pt:cpp/language/explicit]]
+
[[ru:cpp/language/explicit]]
+
[[zh:cpp/language/explicit]]
+

2019年3月21日 (木) 07:24時点における最新版

 
 
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
メモリ確保
クラス
クラス固有の関数特性
explicit (C++11)
static
特別なメンバ関数
テンプレート
その他
 
 
explicit (1)
explicit ( expression ) (2) (C++20以上)
expression - bool 型の文脈的に変換された定数式
1) コンストラクタまたは変換関数 (C++11以上)が明示的である、つまり、暗黙の変換およびコピー初期化で使用できないことを指定します。
2) explicit 指定子は定数式と共に使用することもできます。 定数式が true に評価される場合、その関数は explicit になります。
(C++20以上)

explicit 指定子はクラス定義内のコンストラクタまたは変換関数 (C++11以上)の宣言の decl-specifier-seq にのみ現れることができます。

[編集] ノート

explicit 指定子なしで宣言された非デフォルト引数を1個持つ (C++11未満)コンストラクタは変換コンストラクタと呼ばれます。

(コピー/ムーブ以外の) コンストラクタとユーザ定義変換関数はどちらも、関数テンプレートであっても構いません。 explicit の意味は変わりません。

explicit に続く開き括弧トークンは explicit 指定子の一部として解析されます。

struct S {
    explicit (S)(const S&);    // C++20 ではエラー、 C++17 では OK。
    explicit (operator int)(); // C++20 ではエラー、 C++17 では OK。
};
(C++20以上)

[編集]

struct A
{
    A(int) { }      // 変換コンストラクタ。
    A(int, int) { } // 変換コンストラクタ (C++11)。
    operator bool() const { return true; }
};
 
struct B
{
    explicit B(int) { }
    explicit B(int, int) { }
    explicit operator bool() const { return true; }
};
 
int main()
{
    A a1 = 1;      // OK、コピー初期化は A::A(int) を選択します。
    A a2(2);       // OK、直接初期化は A::A(int) を選択します。
    A a3 {4, 5};   // OK、直接リスト初期化は A::A(int, int) を選択します。
    A a4 = {4, 5}; // OK、コピーリスト初期化は A::A(int, int) を選択します。
    A a5 = (A)1;   // OK、明示的なキャストは static_cast を行います。
    if (a1) ;      // OK、A::operator bool()
    bool na1 = a1; // OK、コピー初期化は A::operator bool() を選択します。
    bool na2 = static_cast<bool>(a1); // OK、 static_cast は直接初期化を行います。
 
//  B b1 = 1;      // エラー、コピー初期化は B::B(int) を考慮しません。
    B b2(2);       // OK、直接初期化は B::B(int) を選択します。
    B b3 {4, 5};   // OK、直接初期化は B::B(int, int) を選択します。
//  B b4 = {4, 5}; // エラー、コピーリスト初期化は B::B(int,int) を考慮しません。
    B b5 = (B)1;   // OK、明示的なキャストは static_cast を行います。
    if (b2) ;      // OK、B::operator bool()
//  bool nb1 = b2; // エラー、コピー初期化は B::operator bool() を考慮しません。
    bool nb2 = static_cast<bool>(b2); // OK、 static_cast は直接初期化を行います。
}