33

explicit引数を取らないコンストラクターにキーワードを使用する理由はありますか? 効果はありますか?線に出くわしたばかりだから気になる

explicit char_separator()

ドキュメントのページの終わり近くにありますboost::char_separatorが、それ以上の説明はありません。

4

1 に答える 1

18

メンバーの説明を読む:

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このキーワードを使用しない場合と同じです。

于 2011-07-21T11:50:59.887 に答える