请考虑以下代码:
#include <string>
class WrapperString
{
public:
WrapperString(const std::string& str) : str_(str) {}
operator std::string() const { return str_; }
operator const std::string() const { return str_; }
std::string get() const { return str_; }
// error C2373: 'WrapperString::get' : redefinition; different type modifiers
// const std::string get() const { return str_; }
private:
std::string str_;
};
int main (int, char *[])
{
WrapperString w( "Hello" );
std::string foo = w; // disabling either implicit conversion makes this work
return 0;
}
为什么WrapperString
实际编译,因为两个隐式转换的区别仅在于const
ness?通过声明命名方法无法实现此结果。
编辑:为了清楚起见,我添加了get()
方法,作为一个逻辑反例,说明为什么两次隐式转换没有意义。
答案 0 :(得分:5)
为什么WrapperString实际编译,因为两个隐式转换的区别仅在于它们的常量
返回类型不是唯一的区别:operator std::string
和operator const std::string
是这两个函数的名称,在这种情况下它们恰好不同,与名称不同get
成员函数。
$3[basic]/4:
“名称是使用[...] conversion-function-id”
$12.3.2.1[class.conv.fct]/1:
conversion-function-id:
operator conversion-type-id
如果您愿意,可以使用普通函数调用语法通过这些名称来调用它们。
std::string s1 = w.operator std::string();
std::string s2 = w.operator const std::string();
std::string s3 = w.get(); // which get?
答案 1 :(得分:4)
这些转换为两种不同的类型,其中一种是const,一种不是。 Constness是该类型的一部分。
这与对具有相同签名且返回不同类型的函数的禁止不同。