在C ++中奇怪地使用[]。怎么了?

时间:2014-09-09 03:14:33

标签: c++

首先,这不是关于数组或运算符[]重载的虚拟问题!

我正在尝试编译Qt Creator并且我在此方法中收到错误:

static QList<IDocumentFactory*> getNonEditorDocumentFactories()
{
    return ExtensionSystem::PluginManager::getObjects<IDocumentFactory>(
        [](IDocumentFactory *factory) {
            return !qobject_cast<IEditorFactory *>(factory);
        });
}

错误是:

mainwindow.cpp:748: error: expected primary-expression before ‘[’ token
mainwindow.cpp:748: error: expected primary-expression before ‘]’ token
mainwindow.cpp:748: error: expected primary-expression before ‘*’ token
mainwindow.cpp:748: error: ‘factory’ was not declared in this scope

我知道我在编译Qt Creator时做错了,可能是g ++版本,但问题不在于此。

我想理解这段代码,因为对我来说[]的使用在语法上是不正确的。有人可以解释一下这里发生了什么。

2 个答案:

答案 0 :(得分:4)

这是一个lambda函数。它是在C ++ 11中引入的。您可以在http://en.cppreference.com/w/cpp/language/lambda获取更多详细信息。

如果您无法使用lambda函数,则C ++ 03中的等效代码将为:

struct MyFunctor
{
   bool operator()(IDocumentFactory *factory) const
   {
      return !qobject_cast<IEditorFactory*>(factory);
   }
};

static QList<IDocumentFactory*> getNonEditorDocumentFactories()
{
    return ExtensionSystem::PluginManager::getObjects<IDocumentFactory>(MyFunctor());
}

您也可以在C ++ 11中使用上述内容,但在c ++ 11中使用lambda函数更为惯用。

答案 1 :(得分:0)

回答这个问题:

  

我想理解这段代码,因为对我来说,[]的使用在语法上是不正确的。有人可以解释一下这里发生了什么。

在C ++中,您可以声明lambda函数:

// declare lambda function and assign it to foo
auto foo = [](){
     std::cout << "hello world" << std::endl;
};

foo(); // call foo

代码中发生的事情是,getObjects&lt;&gt;()正在传递lambda函数作为输入。

return ExtensionSystem::PluginManager::getObjects<IDocumentFactory>(

    // this is the lambda function
    [](IDocumentFactory *factory) {
        return !qobject_cast<IEditorFactory *>(factory);
    }


);