C++11 如何从lambda函数返回nullptr?

C++11 如何从lambda函数返回nullptr?,c++11,lambda,C++11,Lambda,我有一个小lambda函数,它将查找并返回一个QTreeWidgetItem。但如果未找到给定项,则应返回nullptr。但如果我试图编译它,它就会给我一个错误 职能: auto takeTopLevelItem = []( QTreeWidget* aTreeWidget, const QString& aText ) { const int count = aTreeWidget->topLevelItemCount(); for ( int index = 0

我有一个小lambda函数,它将查找并返回一个
QTreeWidgetItem
。但如果未找到给定项,则应返回
nullptr
。但如果我试图编译它,它就会给我一个错误

职能:

auto takeTopLevelItem = []( QTreeWidget* aTreeWidget, const QString& aText )
{
    const int count = aTreeWidget->topLevelItemCount();
    for ( int index = 0; index < count; ++index )
    {
        auto item = aTreeWidget->topLevelItem( index );
        if ( item->text( 0 ) == aText )
        {
            return aTreeWidget->takeTopLevelItem( index );
        }
    }
    return nullptr; // This causes a compilation error.
};
但我想避免使用这种语法。我怎样才能解决这个问题


我使用
Visual Studio 2012

如果您只是想避免语法,而不是强制转换,您可以这样做:

static_cast<QTreeWidgetItem*>(nullptr);
static_cast(nullptr);

我举了一个小例子,说明Bartek和我的答案是如何起作用的:

#include <iostream>

class A {
  int a;
};

auto bla = [] (A* obj, bool flag) -> A* {
  if(flag)
    return obj;
  return nullptr;
//  return static_cast<A*>(nullptr);
};

int main() {
  A obj;
  A* ptr = &obj;
  bool flag = false;
  if( bla(ptr, flag) == nullptr)
    std::cout << "ok\n";
  return 0;
}
#包括
甲级{
INTA;
};
自动bla=[](A*obj,bool标志)->A*{
国际单项体育联合会(旗)
返回obj;
返回空ptr;
//返回静态_cast(nullptr);
};
int main(){
obj;
A*ptr=&obj;
布尔标志=假;
if(bla(ptr,flag)=nullptr)

std::cout您可以添加显式返回类型注释:

auto takeTopLevelItem = []( ... ) -> QTreeWidgetItem*
{
    // ...
}
这样,
nullptr
将正确地转换为指针类型。之所以会出现此错误,是因为lambda假定不应进行转换,并将
nullptr\u t
视为合法的替代返回类型



作为一个旁注,请考虑使用<代码>(STD::)可选的。指针的可空性可以用来表示缺失的返回,但这并不意味着它应该是。

< P>我有一些与智能指针相同的问题,所以我发现我可以这样做以避免问题:

auto myFunc= [](MyClass* class)
{
    MyPointer* pointer = nullptr;
    
    if( class && class->isValid() )
    {
       pointer = class->getPointerInstance()
    }
    
    return pointer;
}
同样,对于共享指针,只需通过
std::shared\u ptr
回复
MyPointer*

因此,您的代码如下所示:

auto takeTopLevelItem = []( QTreeWidget* aTreeWidget, const QString& aText )
{
  QTreeWidgetItem* item = nullptr;
  const int count = aTreeWidget->topLevelItemCount();
  for ( int index = 0; index < count; ++index )
  {
      auto item = aTreeWidget->topLevelItem( index );
      if ( item->text( 0 ) == aText )
      {
          item = aTreeWidget->takeTopLevelItem( index );
          break;
      }
  }
  return item;
};
auto-takeTopLevelItem=[](QTreeWidget*aTreeWidget,常量QString&aText)
{
QTreeWidgetItem*item=nullptr;
const int count=aTreeWidget->topLevelItemCount();
对于(int index=0;indextopLevelItem(索引);
如果(项目->文本(0)=aText)
{
item=aTreeWidget->takeTopLevelItem(索引);
打破
}
}
退货项目;
};

为什么您的示例不能很好地编译?参数结构可以完全编译,留下一个返回类型为
nullptr\u t
的lambda。您的答案要好得多@BartekBanachewicz。删除我的,并给您一个+1。但是您的
静态转换
备注非常好。嗯,您有什么建议吗?编辑回答时只使用
static\u cast
或将其全部删除?@BartekBanachewiczI只保留
static\u cast
位(因为代码示例显然与此无关)我不同意最后一点关于代码>可选< /COD>:大多数的东西在代码> QT< /Cord>中被指针传递,我相信这个lambda的结果被传递到了 Qt。而且,最好是遵循他们的风格,即使在现代C++中可能是邪恶的。在这个特定的例子中感兴趣,但可能是另一个读者的选择。考虑删除关于使用<代码> STD的最后评论::可选的< /代码>,而不是返回一个null pTR。我不认为它会让你的答案更好。上面的部分是完美的。这看起来像是VS2012中的一个bug?@雅克:为什么?错误信息很清楚,不是吗?嗯。奇怪的是,我实际上认为,只要后面的返回类型与第一个返回类型兼容(隐式可转换),一切都可以。IIRC lambda对C++11的建议是有意保守的。为了安全起见,省略了一些相当合理的扩展。
auto takeTopLevelItem = []( QTreeWidget* aTreeWidget, const QString& aText )
{
  QTreeWidgetItem* item = nullptr;
  const int count = aTreeWidget->topLevelItemCount();
  for ( int index = 0; index < count; ++index )
  {
      auto item = aTreeWidget->topLevelItem( index );
      if ( item->text( 0 ) == aText )
      {
          item = aTreeWidget->takeTopLevelItem( index );
          break;
      }
  }
  return item;
};