1

注释代码有效,但它不是参考,因此它具有更多的计算成本。

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是从CObjectwhich 派生的声明:

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

所以,问题是:

  • 如何将替代值分配给保持 const 正确性的引用到 const变量? Items

  • 如果您使用 a 成功回答了第一个问题const_cast,那么您现在可以在没有它的情况下给出解决方案吗?

4

1 回答 1

0

我声明了 lambda 函数,但我忘记调用它。所以,括号是必需的。因此,请注意声明后的(),目的是调用其执行:

const CArray<CItem*>& Items=
    (ItemsInput!= nullptr)?
        *ItemsInput
    :
        [this]() -> const CArray<CItem*>&
        {
            CArray<CItem*> InnerItems;
            GetContainer().GetInnerItems(InnerItems, NULL, true);
            return (InnerItems);
        } ()
;

现在编译正常。

但这又引出了一个新问题:Lambda 没有自动推断返回类型

于 2015-08-20T10:12:48.893 回答