【问题标题】:Strange C++ syntax奇怪的 C++ 语法
【发布时间】:2011-07-24 05:57:20
【问题描述】:

我有 8 年的编码经验,但我从未见过运算符 [] 作为参数传递给函数定义。

例如,以下代码(来自开源项目):

bree::porder(m_root, [] (treenode* node) { delete node; }); 

在我的编码生涯中,我一直将[] 定义为运算符重载器,而不是参数。

那么这个新语法意味着什么?

我正在使用 Visual Studio 2003 附带的编译器。如何更改上述代码以便在 VS 2003 中编译?

【问题讨论】:

标签: c++ visual-c++ visual-studio-2003 lambda square-bracket


【解决方案1】:

这是一个 c++ lambda 你可以用相同定义的函数对象替换代码。该链接显示了两个示例,一个使用 Functor,一个使用 lambda。

【讨论】:

  • 所以 lambda 函数来到 c++... 很有趣。虽然不能说语法特别漂亮或易于理解
  • 是的,they are (at least partially) supported by Visual Studio 2010。现在升级编译器的好理由; 2003 年即将到来。
  • @crasic:语法(至少 [] 的)大多是不可避免的,因为您需要能够指定是否通过引用或值来捕获每个变量。 (如果所有内容都是通过引用隐式引用的,那么您会遇到各种问题,因为您的 lambda 包含对在您调用 lambda 时可能超出范围的对象的引用
【解决方案2】:

它看起来像 anonymous functionC++0x 语法

【讨论】:

  • 两个链接都坏了。
【解决方案3】:

正如其他答案所提到的,它是一种支持 C++0x 羔羊的全新语法。 VS 2010 之前的任何版本的 Visual Studio 都不支持它,因此要让代码 sn-p 在 VS 2003 中工作,您需要重新调整代码以使用函数或仿函数对象。

我认为以下内容可能对您有用:

// somewhere where it would be syntactically valid to 
//  define a function
void treenode_deleter(treenode* node)
{
    delete node;
}


// ...

bree::porder(m_root, treenode_deleter); 

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 2016-08-26
    • 2012-03-14
    • 2012-12-17
    • 2012-10-12
    • 2010-11-24
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多