为什么存在两个仅由返回常量不同的隐式转换?

Mar*_*rkB 4 c++ visual-studio-2010 implicit-conversion

请考虑以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

为什么WrapperString实际编译,因为两个隐式转换的区别仅在于它们的const含义?通过声明命名方法无法实现此结果.

顺便说一句,这是VS2010.

编辑:为了清楚起见,我添加了这些get()方法作为一个逻辑反例,为什么有两个隐式转换没有意义.

Cub*_*bbi 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
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以使用普通函数调用语法通过这些名称调用它们.

 std::string s1 = w.operator std::string();
 std::string s2 = w.operator const std::string();
 std::string s3 = w.get(); // which get?
Run Code Online (Sandbox Code Playgroud)