在您看来,将调用哪个构造函数?
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
答案 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 。
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)