2011-09-19 4 views
7

GoogleTechTalks video on Youtubeでは、Bjarne Stroustrupは今後のC++ 0x標準について語ります。ビデオの中で彼は次の例を挙げ:C++の 'explicit'キーワードの使用例は正しいですか?

#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << d << "\n"; } 
    explicit Sick(int i) { std::cout << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2.1; 
    Sick s2(2.1); 
} 

彼は、特定のコンテキストで暗黙の型変換に関連する問題を強調するために、Sick(double)はなくSick(int)explicitキーワードを配置することを意味しましたか?彼の議論で

+3

youtubeビデオの誰かがどういう意味を知っていると思いますか?重要なことは、この例では 'explicit'の使用を理解していることです。 –

+2

この例で何を表示したいかによってどちらかが合理的でしょう。 – Flexo

+3

@Kerrek SB、あなたは彼が意味していたことを伝えようとしているので、彼が何を意味していたのかを知っていると思われます。 – ikegami

答えて

9

、Stroustrup氏は、このような

Sick s2(2.1); 

として直接初期化は、任意のexplicitコンストラクタがある場合にのみ、コンストラクタはexplicitをマークし検討することに言及しています。これは、GCC 4.6.1やMSVC 16/VS 2010を含むいくつかのコンパイラでの私の経験ではなく、標準でそのような要件を見つけることができません(誰かが指摘できれば興味がありますが)。 int型は初期化子で使用されている場合

はしかし、私は例がStroustrup氏は、証明するために何を意味するのかを示してだと思う:

上記の意志表示を実行
#include <iostream> 

struct Sick 
{ 
    Sick(double d)  { std::cout << "double " << d << "\n"; } 
    explicit Sick(int i) { std::cout << "int " << i << "\n"; } 
}; 


int main() 
{ 
    Sick s1 = 2; 
    Sick s2(2); 
} 

double 2 
int 2 

は、その2つのショー明らかに同等の初期化は実際には異なるコンストラクタを選択します。

(または、質問に記載されているように、私が逃したように - explicitキーワードはSick(double d)コンストラクタにあるはずです)。

関連する問題