2011-09-19 86 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); 
} 

他是说放置explicit关键字Sick(double)而非Sick(int)之前,为了突出与在某些情况下的隐式转换相关的问题?

+3

我们应该如何知道YouTube视频中的某个人意味着什么?重要的是*你在这个例子中明白了'explicit'的使用。 –

+2

要么是合理的,这取决于你想要用这个例子展示什么。 – Flexo

+3

@Kerrek SB,你想知道他的意思,因为他试图表达他的意思。 – ikegami

回答

9

在他的讨论中,斯特劳斯提到了直接初始化,如

Sick s2(2.1); 

只考虑构造标记explicit如果有任何explicit构造。这不是我使用过几种编译器(包括GCC 4.6.1和MSVC 16/VS 2010)的经验,我无法在标准中找到这样的要求(尽管如果有人能指出它,我会感兴趣)。

然而,如果整数都在初始化中使用,我认为例子显示什么斯特劳斯为了演示:

#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 

表明,这两种显然等价的初始化实际上选择了不同的构造函数。

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