在const引用上调用一个属性

我有定义属性的C ++ / CLI类:

public ref class AbstractOffer { public: AbstractOffer(); property String^ Body; }; 

在某些函数中, AbstractOffer类是由const ref传递的

 foo(const AbstractOffer^ ao) { ao->Body; } 

当我调用该属性的方法编译器给出了以下错误: –

错误C2662:'ivrworx :: interop :: AbstractOffer :: Body :: get':无法将'this'指针从'const ivrworx :: interop :: AbstractOffer'转换为'ivrworx :: interop :: AbstractOffer%'1>转换失去资格

这似乎以某种方式连接到const。 如果对象引用被const传递,我怎样才能调用对象的Body属性?

Solutions Collecting From Web of "在const引用上调用一个属性"

我所知道的解决这个问题的唯一方法就是抛弃常规。 只要你不修改对象,应该没问题。 (如果你修改它,我不知道结果会是什么)。
即改变你的功能

 void foo(const AbstractOffer^ ao) { const_cast<AbstractOffer^>(ao)->Body; } 

const限定符是C ++ / CLI中的一个问题。 只有当它可以被检查时才有意义,而且在.NET中通常是不可能的。 当你只有一种编译器,编译器遵循严格的语言规则时,这当然不是问题。 像C ++一样。 但.NET支持多种语言,例如,您可以从Cobol.NET程序轻松调用您的方法。 Cobol语言增加了const正确性的几率是零。

编译器使用const限定符进行编译,并且尽力检查它是否可用。 这就是为什么你得到诊断。 当声明存在于另一个程序集中时,甚至可以工作,只要它是用C ++ / CLI编译的,编译器会在元数据中发出modopt注释。

但是有一些限制。 属性是其中之一,你不能将const限定符添加到getter,或者一般的成员函数中,你会用C3842打耳光。

最好的做法是使用C ++ / CLI进行优化,它是一种互操作语言。 而const限定符在互操作场景中不能正常工作。