构造函数:它是正确的被称为?

时间:2010-11-30 16:57:33

标签: c++ string constructor boolean

在您看来,将调用哪个构造函数?

class Element {
public:
    Element(bool b = true, bool c = true);
    Element(const std::string s, bool b = true, bool c = true);
};
...
Element element("something", true);

错误!第一个。

我是否必须从头开始重新启动Stroustrup的书?

我试过没有const,但没有任何改变。

看起来char *看起来更像是bool而不是std :: string。

使用此代码,一切都可以:

Element element(string("something"), true);

编译器:Microsoft Visual C ++ 2010

操作系统:Windows 7

2 个答案:

答案 0 :(得分:7)

从指针类型到bool的内置转换,非空指针转换为true,空指针值转换为false

std::string是用户定义的类型(最简单的用户一词),因此从const char*std::string的转换不会优先于内置{ {1}}转换为const char*。你必须做这样的事情(或者添加一个带bool的重载)。

const char *

答案 1 :(得分:2)

C ++ Standard(N1905)说,

  

$ 4.1 标准转化是隐含的   为内置定义的转换   类型即可。第4条列举了全部内容   一组这样的转换。一个标准   转换序列是一个序列   以下标准转换   顺序:

     

[...]

     

- 来自的零或一次转换   以下集:整体促销,   浮点促销,积分   转换,浮点   转换,浮动积分   转化,指针转化,   指向成员转化的指针,和   布尔转换。

     

[...]

     

$ 4.4一般来说,是隐含的   转换顺序(13.3.3.1)   由标准转换组成   序列后跟用户定义的   转换,然后是另一个   标准转换序列。

     

4.12布尔转换

     

$ 4.12.1算术,枚举的右值,   指针或指向成员类型的指针可以转换为bool类型的右值。零值,null   指针值,或null成员指针   值转换为false any   其他值转换为true

13.3.3.2对隐式转换序列进行排序

  

2比较基本形式   隐式转换序列(如   在13.3.3.1中定义

     

- 标准   转换序列(13.3.3.1.1)是一个   比a更好的转换顺序   用户定义的转换序列或   省略号转换序列,

     

- a   用户定义的转换序列   (13.3.3.1.2)是一个更好的转换   序列比省略号转换   序列(13.3.3.1.3)。

希望,它能很好地解释您的代码所显示的行为。 : - )

此外,这是一个很好的阅读:

Implicit conversion sequences (C++ only)