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()
方法作为一个逻辑反例,为什么有两个隐式转换没有意义.
为什么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)
归档时间: |
|
查看次数: |
124 次 |
最近记录: |