29

为什么 C++ 要求用户定义的转换运算符只能是非静态成员?为什么不允许像其他一元运算符一样使用独立函数?像这样的东西:

operator bool (const std::string& s) { return !s.empty(); }
4

4 回答 4

9

我能想到的一个原因是防止将隐式转换应用于被强制转换的东西。在您的示例中,如果您说:

 bool( "foo" );

然后“foo”将被隐式转换为字符串,然后将您提供的显式布尔转换应用于它。

如果 bool 运算符是成员函数,则这是不可能的,因为隐式转换不适用于*this. 这大大减少了歧义的可能性——歧义通常被视为“坏事”。

于 2010-01-31T13:38:40.930 回答
0

通过将转换运算符保留在类中,您可以让类的作者控制如何转换它(它可以防止用户创建隐式转换)。作为实现者,我认为这是一个优势,因为隐式转换确实有其问题

能够将一个对象作为另一个对象传递,并让它通过转换函数是有区别的。前者传达对象属于给定类型,而后者向新读者表明两种类型之间存在差异并且需要进行转换。

于 2010-01-31T14:02:27.247 回答
-2

有一组运算符必须作为非静态成员函数重载:赋值、下标、函数调用、类成员访问、转换函数。

我猜标准的委员会或 Stroustrup 只是觉得如果允许从外部将这些非常特殊的行为注入到类中可能会太混乱。


我想获得答案的最好方法是给作者发电子邮件。

于 2010-01-31T14:42:25.200 回答
-3

无论如何,隐式用户定义的转换都是不受欢迎的。不要使用它们。只是假装他们不在那里。更不用说考虑以新的方式来介绍它们了。

无论如何,我猜他们不在那里,因为他们可以做足够多意想不到的事情。包含一个为其他地方定义的类引入这种转换的新标头可能会导致更加混乱的错误。

于 2010-01-31T16:42:59.950 回答