C++ 中 [] 的奇怪用法。怎么了? [复制]

Posted

技术标签:

【中文标题】C++ 中 [] 的奇怪用法。怎么了? [复制]【英文标题】:Strange use of [] in C++. What is happening? [duplicate] 【发布时间】:2014-11-02 09:01:35 【问题描述】:

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

我正在尝试编译 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++ 版本,但问题不在于。

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

【问题讨论】:

这是一个 C++11 lambda:en.cppreference.com/w/cpp/language/lambda. 如果是 C++11 功能,您可能需要 gcc 4.8 或更高版本。 @Ian,这可能是一个更好的答案,因为它回答了特定的问题(“我想理解......”)。只要确保它不是仅链接的答案:-) @paxdiablo;我大体上同意,但现在不想写一个描述性的答案。当其他人这样做时,OP 可以开始浏览该链接(或查看 SO,现在他知道它是什么,因为 C++11 lambda 已经得到很好的讨论)。 欢迎使用现代 C++。现在您可以抛开所有特定于 Qt 的 hack。 【参考方案1】:

这是一个 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 函数更为惯用。

【讨论】:

operator () 应该是 const。 您可能正在寻找 -std=c++11-std=c++0x 编译器选项,具体取决于您的 GCC 版本。【参考方案2】:

回答这个问题:

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

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

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

foo(); // call foo

您的代码中发生的情况是 getObjects() 被传递一个 lambda 函数作为输入。

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

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


); 

【讨论】:

以上是关于C++ 中 [] 的奇怪用法。怎么了? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

用C++里面的copy函数,如何将一个二维数组S1复制到S2去

C++虚函数除了vtable怎么实现? [复制]

c++中为啥要函数返回引用?

这种奇怪的 C++ 语法有啥作用? [复制]

java中vector与C++中vector用法都有哪些区别?

C++怎么用switch语句判断输入的字符