【c++】(基礎だけど)lambda式の注意について

c++

lambda式とは、c++11からサポートされた無名関数です。

Objective-Cで言うblocksみたいなやつなのですが、基礎的な所の注意点を一つ書きたいと思います。

インスタンスはデフォルトで、コピーされる

もう上に書いた通りなのですがコードで見ていきましょう。
「Nodeを格納するVectorを宣言し、そのVectorにlambda式内でNodeを追加する」、と言う感じですね。

Vecto nodes;
function addNode = [nodes]
{
    ((Vector)nodes).pushBack(Node::create());
};
addNode();
CCLOG("%d", (int)nodes.size());

(ぱっと見、)コード的には1を期待したい所ですが、これは0が出力されます。
何がおかしいのでしょうか。ポインタを出力してみましょう。
(実は、ポインタの出力もつまづいたのでブログ書きましたw)

Vector nodes;
function addNode = [nodes]
{
    CCLOG("%p", &nodes);
    ((Vector)nodes).pushBack(Node::create());
};
addNode();
CCLOG("%p %d", &nodes, (int)nodes.size());


0x178223e88
0x16fd70900 0

そうです、lambda式内ではnodesインスタンスがコピーされて入ったのでポインタも違います。

(これは憶測なのですが)更に、コピーされた際にクラス情報も失いpushBackメソッドが使えなくなっています。
明示的にキャストする事でpushBackを用いています。

参照渡しで解決!

上記は下記の様に訂正する事で正しく動作します。

Vector nodes;
function addNode = [&nodes]
{
    CCLOG("%p", &nodes);
    nodes.pushBack(Node::create());
};
addNode();
CCLOG("%p %d", &nodes, (int)nodes.size());

出力は以下です。

0x16fd98900
0x16fd98900 1

正しく動作している事が確認出来ました。
更に参照渡しをする事により正しくクラス情報も渡り、pushBackも使える事が確認出来ました。

誰かのお役に立てば。

このブログのcocos記事一覧

コメント

タイトルとURLをコピーしました