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构造函数。这不是我对几个编译器(包括 GCC 4.6.1 和 MSVC 16/VS 2010)的经验,我在标准中找不到这样的要求(尽管如果有人能指出我会很感兴趣)。

但是,如果在初始化程序中使用整数,我认为该示例将显示 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

表明这两个表面上等效的初始化实际上选择了不同的构造函数。

(或者正如问题中提到的 Truncheon - 我错过了 -explicit关键字应该在Sick(double d)构造函数上)。

于 2011-09-19T19:15:59.090 回答