他言語であるラムダ式だ。
書き方は、

[キャプチャ](引数リスト) ->戻り値型 { }

で、この関数の型は、

std::function<戻り値型 (引数型リスト)>

になる。あと、functionalヘッダをincludeする。

足し算するラムダを書いてみる。

std::function<int(int, int)> plus = [](int a, int b) -> int {
	return a + b;
};

std::cout << plus(1, 1) << std::endl; // "2"を表示

型推論使って、すっきりに。

auto plus = [](int a, int b) -> int {
	return a + b;
};

std::cout << plus(1, 1) << std::endl; // "2"を表示

キャプチャ
いわゆるクロージャを作るのに必要。ラムダ式を宣言したスコープ内のローカル変数をラムダ式内で使用することだ。
まー、書いてみればわかる。

#include "stdafx.h"
#include <iostream>
#include <functional>

std::function<int()> getTestFunc() {
	int hoge = 20;
	return[=]() { return hoge; };
}

int _tmain(int argc, _TCHAR* argv[])
{
	auto test = getTestFunc();

	std::cout << test() << std::endl; // "20"を表示

	return 0;
}

=と書くと、ラムダ式が宣言された段階での値がコピーされる。(コピーキャプチャ)
&と書くと、参照になる。(参照キャプチャ)

#include "stdafx.h"
#include <iostream>
#include <functional>

std::function<int()> getTestFunc() {
	int hoge = 20;
	return[&]() { return hoge; };
}

int _tmain(int argc, _TCHAR* argv[])
{
	auto test = getTestFunc();
	
	std::cout << test() << std::endl; // 変な値が表示される。
	
	return 0;
}

参照だと、getTestFuncからリターンした段階でローカル変数のhogeは無くなっているので変なところを参照していることになり、変な値が表示される。やっちゃ、いけない。考えて使おー。

変数を個別にコピーキャプチャする場合は、[]内に[hoge1, hoge2]のように変数名をカンマ区切りで書く。参照キャプチャする場合は、[&hoge1, &hoge2]のように書く。[hoge1, &hoge2]のようにコピーキャプチャの変数と参照キャプチャの変数も混ぜれる。hoge1は参照キャプチャでそれ以外はコピーキャプチャの場合は[=,&hoge1]と書く。

JavaScriptのクロージャの説明でよくあるカウントアップする関数を返すのを書いてみる。

std::function<int()> getCounter()  {
	int counter = 0;
	return[counter]() { return ++counter; };
}

けど、エラーになる。キャプチャした変数が変更できないみたいだ。
変更するには、ラムダ式mutableをつける。

#include "stdafx.h"
#include <iostream>
#include <functional>

std::function<int()> getCounter()  {
	int counter = 0;
	return[counter]() mutable { return ++counter; };
}

int _tmain(int argc, _TCHAR* argv[])
{
	auto countUp = getCounter();
	
	std::cout << countUp() << std::endl; // "1"を表示
	std::cout << countUp() << std::endl; // "2"を表示
	std::cout << countUp() << std::endl; // "3"を表示
	std::cout << countUp() << std::endl; // "4"を表示
	
	return 0;
}