バグの原因を見つけるために掘り下げた後、私は次のものが合法的なC++ 11(GCC/Wall with Wallと一緒にコンパイルされている)と思われることに驚きました。特に、f1
は、その引数を値で取って、RefFunction
に参照することができます。lvalue参照を取るstd ::関数にby-value引数を取る関数をバインドすることができますか?
私は説明のためにグーグルを試みましたが、関連するものは何も見つかりませんでした。なぜなら、私はグーグルを正確に知らないからです。私は本当になぜこれが合法であるかによって誰かが私を導くことができれば感謝しています。
#include <iostream>
using namespace std;
void f1(int val) {
val = 1;
}
void f2(int& val) {
val = 2;
}
using RefFunction = std::function<void(int&)>;
int main()
{
using namespace std::placeholders;
int val = 42;
// I was expecting a compile error here telling me that f1 doesn't
// have the right signature (int instead of int&)
RefFunction f = f1;
f(val);
cout << val << endl; // prints 42
// This makes sense, f2 takes argument by reference
f = f2;
f(val);
cout << val << endl; // prints 2
return EXIT_SUCCESS;
}
ありがとうございます。これは今実際に意味をなさない。私は残念なことに1つの答えだけを受け入れることができ、私は両方の答えが良いと言うでしょう。 – Julien