7

Youtube の GoogleTechTalks ビデオで、Bjarne Stroustrup が今後の C++0x 標準について語っています。ビデオの中で、彼は次の例に言及しています。

#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);
}

特定のコンテキストでの暗黙の変換に関連する問題を強調するために、explicitキーワードをSick(double)ではなくの前に置くつもりだったのでしょうか?Sick(int)

4

1 に答える 1

9

彼の議論の中で、Stroustrupは、次のような直接初期化について言及しています。

Sick s2(2.1);

explicitコンストラクターがある場合は、マークされたコンストラクターのみを考慮しexplicitます。これは、いくつかのコンパイラ(GCC4.6.1およびMSVC16 / 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つの明らかに同等の初期化が実際に異なるコンストラクターを選択することを示します。

(または、質問でTruncheonが述べたように(そして私は見逃しましたが)、explicitキーワードはコンストラクターにあるべきですSick(double d))。

于 2011-09-19T19:15:59.090 に答える