2011-07-21 4 views
22
のない関数の明示的なキーワード

可能性の重複:
What does the explicit keyword in C++ mean?C++引数

引数を取らない関数のためexplicitキーワードを使用する理由はありますか?何か影響はありますか?私はちょうどラインページの文書化ブーストの終わり:: char_separator (http://www.boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm)近く

explicit char_separator()

に出くわしたので、私は思ったんだけど、それはそれ以上が説明されていないです。 explanation of membersを読む

+6

詐欺ではありません。この質問は 'explicit'キーワードの非常に特殊なコーナーケースについてです。 –

+4

これは関数ではなく、コンストラクタです。http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean/121163#121163 – Skizz

+0

@larsmans見ることなく伝えるのは難しいいくつかの実際の例 –

答えて

14

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型のオブジェクトを明示的に作成する必要があります。 What does the explicit keyword mean in C++?は、明示的なキーワードを非常にうまくカバーしています。

第2コンストラクタのキーワードexplicitはノイズで無視されます。 C++標準から

EDIT

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キーワードでデフォルトコンストラクタは、このキーワードなしで同じです。