【问题标题】:Is this example of the use of the C++ 'explicit' keyword correct?这个使用 C++ 'explicit' 关键字的例子是否正确?
【发布时间】:2011-09-19 18:37:12
【问题描述】:

GoogleTechTalks video on Youtube 中,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);
}

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

【问题讨论】:

  • 我们应该如何知道 youtube 视频中某人的意思?重要的是了解explicit在这个例子中的用法。
  • 哪一种都是合理的,这取决于你想用这个例子展示什么。
  • @Kerrek SB,你应该知道他的意思,因为他试图传达他的意思。
  • @ikdegami:该示例甚至没有使用int 版本,因此我高度怀疑该示例是否被准确复制或与要提出的观点相关。对 C++11 的额外提及进一步强化了视频谈话与 OP 的问题之间存在脱节。
  • 伙计们,不要太认真。我只是好奇为什么将显式关键字放置在它所在的位置,而实际上似乎不需要它。尝试按原样编译示例,然后删除关键字。另外,我很确定 S 先生犯了一个简单的错误,就像我们时常犯的那样。

标签: c++ c++11 implicit-conversion explicit


【解决方案1】:

在他的讨论中,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) 构造函数上)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多