这个使用C++'explicit'关键字的例子是否正确?

Tru*_*eon 7 c++ explicit implicit-conversion c++11

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);
}
Run Code Online (Sandbox Code Playgroud)

他是否意味着将explicit关键字放在之前Sick(double)而不是Sick(int),以突出显示与某些上下文中的隐式转换相关的问题?

Mic*_*urr 9

在他的讨论中,Stroustrup提到了直接初始化,例如

Sick s2(2.1);
Run Code Online (Sandbox Code Playgroud)

只考虑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);
}
Run Code Online (Sandbox Code Playgroud)

运行以上将显示:

double 2
int 2
Run Code Online (Sandbox Code Playgroud)

显示两个明显等效的初始化实际上选择了不同的构造函数.

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