如何从通过非常量输出参数提供所需数据的函数中获取替代值,以便为其分配对常量变量的引用?
How to get alternative value from function that gives wanted data via non-const output parameter for assigning reference-to-const variable to it?
评论的代码有效,但它不是参考,因此计算成本更高。
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
需要注意的重要事项:
- 我在 lambda 捕获上传递
this
,只是为了访问 GetInnerItems
方法
GetInnerItems
方法通过其类型为 CArray<CItem*>&
的第一个参数给出内部项,该参数是非常量且永远不可能是常量。
因此,在我看来,问题在于 GetInnerItems
的工作方式,与三元运算符无关。假设我不能将其签名更改为 return a CArray
,因为 CArray
派生自 CObject
,它声明:
class AFX_NOVTABLE CObject
{
//...
private:
CObject(const CObject& objectSrc); // no implementation
void operator=(const CObject& objectSrc); // no implementation
//...
}
所以,问题是:
如何将替代值分配给 reference-to-const Items
保持常量正确性的变量?
如果您使用 const_cast
成功回答了第一个问题,现在可以给出没有它的解决方案吗?
我声明了 lambda 函数,但我忘了调用它。所以,需要括号。因此,请注意声明后的 () 以调用其执行为目标:
const CArray<CItem*>& Items=
(ItemsInput!= nullptr)?
*ItemsInput
:
[this]() -> const CArray<CItem*>&
{
CArray<CItem*> InnerItems;
GetContainer().GetInnerItems(InnerItems, NULL, true);
return (InnerItems);
} ()
;
现在可以正常编译了。
但这引出了一个新问题:Lambda did not automatically deduce return type
评论的代码有效,但它不是参考,因此计算成本更高。
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
需要注意的重要事项:
- 我在 lambda 捕获上传递
this
,只是为了访问GetInnerItems
方法 GetInnerItems
方法通过其类型为CArray<CItem*>&
的第一个参数给出内部项,该参数是非常量且永远不可能是常量。
因此,在我看来,问题在于 GetInnerItems
的工作方式,与三元运算符无关。假设我不能将其签名更改为 return a CArray
,因为 CArray
派生自 CObject
,它声明:
class AFX_NOVTABLE CObject
{
//...
private:
CObject(const CObject& objectSrc); // no implementation
void operator=(const CObject& objectSrc); // no implementation
//...
}
所以,问题是:
如何将替代值分配给 reference-to-const
Items
保持常量正确性的变量?如果您使用
const_cast
成功回答了第一个问题,现在可以给出没有它的解决方案吗?
我声明了 lambda 函数,但我忘了调用它。所以,需要括号。因此,请注意声明后的 () 以调用其执行为目标:
const CArray<CItem*>& Items=
(ItemsInput!= nullptr)?
*ItemsInput
:
[this]() -> const CArray<CItem*>&
{
CArray<CItem*> InnerItems;
GetContainer().GetInnerItems(InnerItems, NULL, true);
return (InnerItems);
} ()
;
现在可以正常编译了。
但这引出了一个新问题:Lambda did not automatically deduce return type