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

时间:2014-01-31 21:21:03

标签: 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;
}

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

顺便说一下,这是VS2010。

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

2 个答案:

答案 0 :(得分:5)

  

为什么WrapperString实际编译,因为两个隐式转换的区别仅在于它们的常量

返回类型不是唯一的区别:operator std::stringoperator 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是该类型的一部分。

这与对具有相同签名且返回不同类型的函数的禁止不同。