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去