「cpp/language/explicit」の版間の差分
提供: cppreference.com
細 (Use {{lc}}. Update links. Various fixes.) |
|||
(1人の利用者による、間の1版が非表示) | |||
1行: | 1行: | ||
− | + | {{title|explicit }} | |
− | {{title|explicit | + | {{cpp/language/navbar}} |
− | {{cpp/language/navbar}} | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
{{sdsc begin}} | {{sdsc begin}} | ||
− | {{sdsc | + | {{sdsc| |
− | {{ | + | {{|explicit}} |
+ | |||
+ | {{|{{}} | ||
+ | {{|explicit }} {{spar|}} {{}} | ||
+ | }} | ||
{{sdsc end}} | {{sdsc end}} | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
===例=== | ===例=== | ||
{{example|code= | {{example|code= | ||
struct A | struct A | ||
{ | { | ||
− | A ( int ) {} | + | A(int) { } |
− | + | ||
− | operator | + | operator () const { return ; } |
}; | }; | ||
struct B | struct B | ||
{ | { | ||
− | explicit B(int) {} | + | explicit B(int) { } |
− | explicit | + | explicit int |
+ | () const { return ; } | ||
}; | }; | ||
int main() | int main() | ||
{ | { | ||
− | + | A a1 = 1; | |
− | A a1 = 1; | + | A a2(2); |
− | A a2 ( 2 ); | + | A a3 {}; |
− | A a3 { | + | int |
− | int na1 = a1; | + | |
− | + | ||
− | + | na1 = a1; | |
− | + | na2 = static_cast<>(a1); | |
− | B b2 ( 2 ); // | + | |
− | B b3 { | + | B b1 = 1; // :B |
− | + | B b2(2); // : | |
− | + | B b3 {}; // : | |
+ | int | ||
+ | = | ||
+ | b2; // : | ||
+ | B | ||
+ | nb2 = static_cast<>(b2); // | ||
} | } | ||
}} | }} | ||
− | + | deenesfritptruzh | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + |
2019年3月21日 (木) 07:24時点における最新版
explicit
|
(1) | ||||||||
explicit ( expression )
|
(2) | (C++20以上) | |||||||
expression | - | bool 型の文脈的に変換された定数式。 |
2) explicit 指定子は定数式と共に使用することもできます。 定数式が true に評価される場合、その関数は explicit になります。
|
(C++20以上) |
explicit 指定子はクラス定義内のコンストラクタまたは変換関数 (C++11以上)の宣言の decl-specifier-seq にのみ現れることができます。
[編集] ノート
explicit 指定子なしで宣言された非デフォルト引数を1個持つ (C++11未満)コンストラクタは変換コンストラクタと呼ばれます。
(コピー/ムーブ以外の) コンストラクタとユーザ定義変換関数はどちらも、関数テンプレートであっても構いません。 explicit
の意味は変わりません。
struct S { explicit (S)(const S&); // C++20 ではエラー、 C++17 では OK。 explicit (operator int)(); // C++20 ではエラー、 C++17 では OK。 }; |
(C++20以上) |
[編集] 例
Run this code
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 は直接初期化を行います。 }