如何从通过非常量输出参数提供所需数据的函数中获取替代值,以便为其分配对常量变量的引用?

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

需要注意的重要事项:

因此,在我看来,问题在于 GetInnerItems 的工作方式,与三元运算符无关。假设我不能将其签名更改为 return a CArray,因为 CArray 派生自 CObject,它声明:

class AFX_NOVTABLE CObject
{
//...
private:
    CObject(const CObject& objectSrc);              // no implementation
    void operator=(const CObject& objectSrc);       // no implementation
//...
}

所以,问题是:

我声明了 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