【发布时间】:2013-02-08 12:50:32
【问题描述】:
我正在定义赋值运算符的多个重载,如下所示:
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);
};
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;}
这是我的 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");
问题:有人能告诉我为什么在布尔上下文中评估未转换的字符串文字吗?
【问题讨论】:
-
@Mooing Duck:为什么要删除构造函数?我添加它们是为了有意表明一个变量可以通过构造函数初始化,然后通过赋值重新分配操作员。 (正如我在其他 SO 帖子中看到的,有时您需要both。)
-
由于Good questions have a short self contained compilable example 和your code could be significantly shorter and simpler and still reproduce the problem,我对代码进行了修剪。我第一次没有阅读您的大部分问题,因为其中的代码 far 太多,而且我(正确地)猜到其中大部分与您的问题无关。
-
@Mooing Duck:是的,我原则上非常同意,并且在将构造函数添加到我的示例时确实考虑了这一点。但我会在这里听从你的判断。但是,我希望看到我的评论的任何人都知道要考虑相关的构造函数。
-
我不明白,你为什么希望他们考虑相关的构造函数?构造函数可能与类似的问题相关,但它们与这个问题完全无关。如果他们看到构造函数,那可能会让人们认为这与他们的构造函数有关。
-
@Mooing Duck:感谢您继续推动。现在真正让我陷入困境的是
Foo(std::string&)和Foo(char *)的方法签名完全不同,无论Foo是构造函数还是任何其他方法。所以,我现在意识到我在理解上的差距确实超出了我所看到的赋值运算符(我发布的问题的主题)。
标签: c++ string boolean operator-overloading assignment-operator