N3225のサブセクション20.8.10.1
のstd::bind
の説明を読み終えませんでした。それは、次のように1
を印刷しなければならないと言いますが、bind
はその引数をコピーすることになっているので、0
を印刷する必要があります。渡された引数を参照する場合は、std::ref
を使用する必要があります。何がstd :: bind(x、y)は何をしますか?
void f(int &a) { a = 1; }
int main() {
int a = 0;
std::bind(f, a)();
std::cout << a << std::endl;
}
GCC出力0
、私は物事が仕事と思ったものと同意。しかし、N3225はstd::bind(f, a1)
はINVOKE(f, v1)
を呼び出しますwrapper()
によって呼び出されたときv1
(私は、std::forward<A1>(a1)
完璧な転送パラメータであるbinds
の入ってくるパラメータを使用して、他の言葉で、渡された引数)a
しなければならないことを呼び出しラッパーを返還しなければならないと述べています。
INVOKE(f, a)
は、20.8.2~f(a)
で定義されます。したがって、これは、返された呼び出しラッパーの呼び出しが元の引数を渡すことを定義します。私は何が欠けていますか?
http://stackoverflow.com/questions/4327474/does-perfect-forwarding-in-c0x-make-reference-wrapper-deprecated(重複はしませんが関連性はありますか?C + + 0x) – CashCow