【问题标题】:What does "[ this ]" mean in C++“[this]”在 C++ 中是什么意思
【发布时间】:2014-05-20 17:49:53
【问题描述】:

当我阅读Cocos2dx 3.0 API 时,我发现了这样的内容:

auto listener = [this](Event* event){
    auto keyboardEvent = static_cast<EventKeyboard*>(event);
    if (keyboardEvent->_isPressed)
    {
        if (onKeyPressed != nullptr)
            onKeyPressed(keyboardEvent->_keyCode, event);
    }
    else
    {
        if (onKeyReleased != nullptr)
            onKeyReleased(keyboardEvent->_keyCode, event);
    }
};

[this] 是什么意思?这是C++11 中的新语法吗?

【问题讨论】:

  • 这是一个 lambda,您正在将当前实例绑定到它。
  • 表示你捕获了this
  • 明确提及this 真的有意义吗?它不会被onKeyPressedonKeyReleased 的引用自动捕获(假设它们是this 的成员)。还有一个警告,keyboardEvent 现在持有this 指针的副本...如果keyboardEvent 设法比this 指向的任何东西寿命长...(标准对象生命周期问题)跨度>
  • 所有具有 [](){} 形式的东西都是 lambda(是的,这是 C++11 的新功能)。
  • 使用auto 关键字和空指针文字nullptr 的自动类型推导也是C++11。

标签: c++ api c++11 syntax cocos2d-x


【解决方案1】:

[this] 是什么意思?

它引入了lambda - 一个可调用的函数对象。将 this 放在括号中意味着 lambda 捕获 this,以便该对象的成员在其中可用。 Lambda 还可以通过值或引用来捕获局部变量,如链接页面中所述。

lambda 有operator() 的重载,因此可以像函数一样调用它:

Event * event = some_event();
listener(event);

它将运行 lambda 主体中定义的代码。

这是 C++11 中的新语法吗?

是的。

【讨论】:

  • 我不想成为 PIA,如果术语“operator() 的重载”在这里在技术上是正确的,我真的很感兴趣?我知道ClosureType 是一个类型并且有一个成员函数operator(),但我认为它在任何时候都没有重载,不是吗?
  • @luk32 它重载了内置运算符,就像用户声明的运算符重载一样。
  • 嗯,它可能是当我们谈论一个只能被声明为类的方法的运算符时,它不是“重载”,因为它不是表示默认为该类定义。然而,对于操作员来说,通常会说他们被“重载”了,因为它总是说任何已经在别处定义的可调用的东西。结果,每个运算符定义都是“重载”。
猜你喜欢
  • 2011-09-10
  • 2015-05-01
  • 2011-06-20
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2018-10-29
  • 2012-05-04
  • 2013-03-29
相关资源
最近更新 更多