注释代码有效,但它不是参考,因此它具有更多的计算成本。
void CClass::Function(const CArray<CItem*>* ItemsInput) const
{
/*
CArray<CItem*> Items;
if (ItemsInput != nullptr)
Items.Copy(*ItemsInput);
else
GetContainer().GetInnerItems(Items, NULL, true);
*/
const CArray<CItem*>& Items=
(ItemsInput!= nullptr)?
*ItemsInput
:
[this] () -> const CArray<CItem*>
{
CArray<CItem*> InnerItems;
GetContainer().GetInnerItems(InnerItems, NULL, true);
return const_cast <const CArray<CItem*>& > (InnerItems);
}
;
//...
}
未注释的代码是我尝试使用三元运算符和 lambda 表达式的最大程度,但直到现在它还没有成功,给出了错误:
1>Class.cpp(line of the last semicolon): error C2446: ':' : no conversion from '`anonymous-namespace'::<lambda2>' to 'const CArray<TYPE>'
1> with
1> [
1> TYPE=CItem *
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
需要注意的重要事项:
- 我传递
this
了 lambda 捕获,只是为了访问该GetInnerItems
方法 - 该
GetInnerItems
方法通过其类型的第一个参数提供内部项目,该参数CArray<CItem*>&
是非常量且永远不会是 const。
因此,在我看来,问题在于GetInnerItems
工作方式,与三元运算符无关。假设我不能改变它的签名来返回 a CArray
,因为CArray
是从CObject
which 派生的声明:
class AFX_NOVTABLE CObject
{
//...
private:
CObject(const CObject& objectSrc); // no implementation
void operator=(const CObject& objectSrc); // no implementation
//...
}
所以,问题是:
如何将替代值分配给保持 const 正确性的引用到 const变量?
Items
如果您使用 a 成功回答了第一个问题
const_cast
,那么您现在可以在没有它的情况下给出解决方案吗?