重载强制转换运算符时的 C++ 歧义

Posted

技术标签:

【中文标题】重载强制转换运算符时的 C++ 歧义【英文标题】:C++ ambiguity while overloading cast operator 【发布时间】:2014-07-15 03:28:58 【问题描述】:

找到:Ambiguity while overloading the cast operator

C++ Operator Ambiguity

没有帮助

情况:

在容器类的主体内部:

operator T& () const 
    return *data;


operator const T& () const 
    return *data;

意图是:

container<object> test = new object;
object& whatever = test; //<--uses (T&) cast
const object& other = test; //<--uses (const T&) cast

但是第二个会导致错误,因为它不明确。

我完全明白为什么编译器会抱怨,可以将 object&amp;const object&amp; 分配给 const object&amp; 但是我希望它不要抱怨并选择第二个(返回 const object&amp;

哦,等等,刚刚得到我的答案。

【问题讨论】:

【参考方案1】:

即使它们是不同的转换运算符(不仅仅是一个的重载),也可以通过删除第一个上的 const 来解决歧义。

因此:

operator T& () 
    return *data;


operator const T& () const 
    return *data;

或者,如果通过const 对象提供对指向数据的非const 访问确实有意义,那么就这样做

operator T& () const 
    return *data;

【讨论】:

【参考方案2】:

别傻了。正如我所说,您可以将object&amp;const object&amp; 分配给const object&amp;,因此无论哪种情况,第一个转换运算符都足以完成这项工作。

我傻了。希望这对将来的人有所帮助!

【讨论】:

根据您想要的语义(const 容器保存的数据是否应该是可变的),将第一个重载设为非const 可能更有意义。

以上是关于重载强制转换运算符时的 C++ 歧义的主要内容,如果未能解决你的问题,请参考以下文章

c ++:强制转换运算符与分配运算符与转换构造函数优先级

重载()运算符和重载强制类型转换

在 C# 中是不是可以通过以下方式重载泛型强制转换运算符?

为枚举类重载强制转换运算符

C++ --- 强制转换运算符

在 C++ 中覆盖强制转换运算符