Dav*_*dRR 5 c++ string boolean operator-overloading assignment-operator
我正在定义赋值运算符的多个重载,如下所示:
foo.h中
class Foo
{
private:
bool my_bool;
int my_int;
std::string my_string;
public:
Foo& operator= (bool value);
Foo& operator= (int value);
Foo& operator= (const std::string& value);
};
Run Code Online (Sandbox Code Playgroud)
Foo.cpp中
// Assignment Operators.
Foo& Foo::operator= (bool value) {my_bool = value; return *this;}
Foo& Foo::operator= (int value) {my_int = value; return *this;}
Foo& Foo::operator= (const std::string& value) {my_string = value; return *this;}
Run Code Online (Sandbox Code Playgroud)
这是我的main.cpp(参见标记的注释SURPRISE):
Foo boolFoo;
Foo intFoo;
Foo stringFoo;
// Reassign values via appropriate assignment operator.
boolFoo = true; // works...assigned as bool
intFoo = 42; // works...assigned as int
stringFoo = "i_am_a_string"; // SURPRISE...assigned as bool, not string
std::string s = "i_am_a_string";
stringFoo = s; // works...assigned as string
// works...but awkward
stringFoo = static_cast<std::string>("i_am_a_string");
Run Code Online (Sandbox Code Playgroud)
问题:有人可以告诉我为什么在布尔上下文中评估未记录的字符串文字?
Dan*_*rey 10
C++标准在第13.3章中定义了重载决策规则,你会发现:
13.3.3.2对隐式转换序列进行排序[over.ics.rank]
2比较隐式转换序列的基本形式(如13.3.3.1中所定义)
- 标准转换序列(13.3.3.1.1)是比用户定义的转换序列或省略号转换序列更好的转换序列,并且
- 用户定义的转换序列(13.3.3.1.2)是比省略号转换序列(13.3.3.1.3)更好的转换序列.
这意味着,编译器会更喜欢从字符串标准转换序列字面来bool或者int(如果可用).现在,哪些标准转换是相关的?在您的情况下,这两个是相关的:
4.2数组到指针的转换[conv.array]
1可以将"数组NT"或"未知T的数组"类型的左值或右值转换为"指向T的指针"的prvalue.结果是指向数组的第一个元素的指针.
此转换将字符串文字(类型const char[N])转换为const char*.第二个是:
4.12布尔转换[conv.bool]
1算术,无范围枚举,指针或指向成员类型的指针的prvalue可以转换为类型的prvalue
bool.将零值,空指针值或空成员指针值转换为false; 任何其他值都转换为true.类型std::nullptr_t的prvalue可以转换为类型的prvaluebool; 结果值是false.
这就是指针转换为的原因bool.由于存在标准转换序列,因此std::string不使用用户定义的转换.
为了解决您的问题,我建议您添加另一个重载版本,const char*并将其转发到const std::string&重载调用.