[英]C++ Implicit Conversion Operators Precedence
编辑:在迈克·西摩的评论后,我替换了operator std::string () const;
使用operator char * () const;
并相应地更改了实现。 这允许隐式强制转换,但是由于某种原因,unsigned long int运算符的优先级高于char *运算符,这感觉不对。。而且,我不想在类,当我有std :: string时。 我有一个预感,我的CustomizedInt类需要从某些东西继承来支持我想要的功能。 有人可以详细说明Mike关于std::basic_string
的评论吗? 我不确定我是否理解正确。
我有这段代码:
#include <string>
#include <sstream>
#include <iostream>
class CustomizedInt
{
private:
int data;
public:
CustomizedInt() : data(123)
{
}
operator unsigned long int () const;
operator std::string () const;
};
CustomizedInt::operator unsigned long int () const
{
std::cout << "Called operator unsigned long int; ";
unsigned long int output;
output = (unsigned long int)data;
return output;
}
CustomizedInt::operator std::string () const
{
std::cout << "Called operator std::string; ";
std::stringstream ss;
ss << this->data;
return ss.str();
}
int main()
{
CustomizedInt x;
std::cout << x << std::endl;
return 0;
}
其中显示“ Called operator unsigned long int; 123”。 我的问题是:
删除运算符unsigned long int后,为什么需要将x强制转换为std :: string? 为什么不直接调用隐式强制转换运算符(std :: string)?
字符串的<<
版本是一个模板,由std::basic_string
模板的参数设置参数( std::string
本身是该模板的一种特殊形式)。 它只能通过依赖于参数的查找来选择,并且仅在参数实际上是std::basic_string
而不是可转换的东西时才起作用。
是否有任何文档说明允许哪些隐式强制转换及其优先顺序?
规则非常复杂,您需要阅读C ++标准以获取全文。 简单的经验法则是,隐式转换不能包含多个用户定义的转换,并且(如您所知),隐式转换的结果不能用于通过依赖于参数的查找来选择模板特化。
我不确定我是否完全理解相关的警告。 有人可以概述一下吗?
我也不完全理解它们。 隐式转换,名称查找和模板专业化之间的相互作用(可能还有我现在无法想到的其他因素)非常复杂,并且大多数人都不愿意全部学习它们。 在很多情况下不会发生隐式转换,而在其他情况下可能会在您不期望的情况下发生。 就个人而言,我发现在大多数情况下避免隐式转换会更容易。
仅定义公共方法ToUnsignedLongInt和ToString是否是更好的做法?
避免不必要的转换可能是个好主意。 您可以通过留下问题来解决问题,并在必要时明确使用它们:
std::cout << std::string(x) << std::endl;
在C ++ 11中,可以将它们声明为explicit
,因此只能以这种方式使用它们。 我认为,这将是最好的选择。 否则,我将按照您的建议使用显式转换函数。
顺便说一句, main()
的返回类型必须是int
,而不是void
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.