我试图弄清楚编译器为什么不推断它应该使用Obj
的字符串构造函数。
这种情况不应该启用隐式构造吗? (我传递const引用字符串和const引用Obj) 不是隐含建构的整个想法吗?我在这里失踪了什么?
class Obj
{
public:
Obj(const std::string& str)
{
}
void operator+=(const Obj& other)
{
cout << "operator+=" << endl;
}
Obj& operator++()
{
operator +=("something"); // error
return *this;
}
};
我用gcc 4.8.2编译, 谢谢!
答案 0 :(得分:3)
从字符串文字"something"
到Obj
的转换需要两个用户定义的转换:一个从字符串文字到std::string
,另一个使用您的构造函数从std::string
到Obj
。隐式转换序列仅限于包含一个用户定义的转换。
解决此问题的最佳方法是添加另一个带有C字符串的构造函数,
Obj(const char* str)
如果您不想添加此类构造函数并且只想执行一次此转换,则可以:
operator+=(std::string("something"))
(明确执行第一次转换)operator+=("something"s)
,使用新的用户定义的文字后缀s
构建std::string
答案 1 :(得分:2)
不允许多个用户定义的转化。您有两个,char*
到std::string
,std::string
到Obj
。您可以通过将std::string
传递到operator+=
:
Obj& operator++()
{
operator +=(std::string("something"));
return *this;
}
或者,您可以添加一个带有const char*
“
Obj(const char* str)