explicit
引数を取らないコンストラクターにキーワードを使用する理由はありますか? 効果はありますか?線に出くわしたばかりだから気になる
explicit char_separator()
ドキュメントのページの終わり近くにありますboost::char_separator
が、それ以上の説明はありません。
explicit
引数を取らないコンストラクターにキーワードを使用する理由はありますか? 効果はありますか?線に出くわしたばかりだから気になる
explicit char_separator()
ドキュメントのページの終わり近くにありますboost::char_separator
が、それ以上の説明はありません。
メンバーの説明を読む:
explicit char_separator(const Char* dropped_delims,
const Char* kept_delims = "",
empty_token_policy empty_tokens = drop_empty_tokens)
explicit char_separator()
最初のコンストラクターのexplicit
キーワードでは、char_separator タイプのオブジェクトを明示的に作成する必要があります。
C++ での明示的なキーワードの意味は何ですか? 明示的なキーワードを非常によくカバーしています。
2 番目のコンストラクターのexplicit
キーワードはノイズであり、無視されます。
編集
C++ 標準から:
7.1.2 p6 は次のように伝えます。
明示的な指定子は、クラス宣言内のコンストラクターの宣言でのみ使用されます。12.3.1 を参照。
12.3.1 p2 は次のように伝えます。
明示的なコンストラクターは、非明示的なコンストラクターと同じようにオブジェクトを構築しますが、直接初期化構文 (8.5) またはキャスト (5.2.9、5.4) が明示的に使用されている場合にのみ構築します。デフォルトのコンストラクターは、明示的なコンストラクターの場合があります。このようなコンストラクターは、デフォルトの初期化または値の初期化 (8.5) を実行するために使用されます。[例:
class Z {
public:
explicit Z();
explicit Z(int);
// ...
};
Z a; // OK: default-initialization performed
Z a1 = 1; // error: no implicit conversion
Z a3 = Z(1); // OK: direct initialization syntax used
Z a2(1); // OK: direct initialization syntax used
Z* p = new Z(1); // OK: direct initialization syntax used
Z a4 = (Z)1; // OK: explicit cast used
Z a5 = static_cast<Z>(1); // OK: explicit cast used
—終わりの例]
したがって、キーワードを使用したデフォルトのコンストラクターは、explicit
このキーワードを使用しない場合と同じです。