原因是字符串文字 ( char*
) 转换为bool
比 to 更好,std::string
因此您的字符串文字不会初始化string
变体的组件,而是初始化bool
组件(为真)。
请参阅以下输出bool 1
:
#include <iostream>
void foo(bool b)
{
std::cout << "bool " << b << std::endl;
}
void foo(std::string s)
{
std::cout << "string " << s << std::endl;
}
int main()
{
foo("Bar");
}
初始化std::string("toto")
将解决您的问题。
4.12/1 向我们展示了有问题的转换:
A prvalue of arithmetic, unscoped enumeration, pointer, or pointer to member type can be converted to a
prvalue of type bool. A zero value, null pointer value, or null member pointer value is converted to false;
any other value is converted to true. A prvalue of type std::nullptr_t can be converted to a prvalue of
type bool; the resulting value is false.
[正如另一个答案中所述]这种隐式转换优先于转换构造函数,std::string
因此被选择,导致变体中使用的类型为bool
。