次のコードを検討してください。
#include <iostream>
#include <functional>
// passing function object by value
void foo(std::function<int(int, int)> f) {
std::cout << f(3, 7) << std::endl;
}
// passing const function object by reference
void bar(const std::function<int(int, int)> & f) {
std::cout << f(3, 7) << std::endl;
}
// passing non-const function object by reference
void fizz(std::function<int(int, int)> & f) {
std::cout << f(3, 7) << std::endl;
}
int main() {
std::function<int(int, int)> g1 = [] (int x, int y) { return x * y; };
auto g2 = [] (int x, int y) { return x * y; };
foo(g1); // OK
foo(g2); // OK
bar(g1); // OK
bar(g2); // OK
fizz(g1); // OK
// compile error:
// error: invalid initialization of reference of type
// 'std::function<int(int, int)>&' from expression of type
// 'main()::<lambda(int, int)>'
// error: in passing argument 1 of 'void fizz(std::function<int(int, int)>&)'
fizz(g2);
}
誰かが私に説明してくれますか:
(a)fizz(g2)
コンパイル エラーが発生し、他の構成では発生しないのはなぜですか? 宣言でその型を明示的に入力すると、参照によってラムダを渡すことができるようですが、auto
キーワードを使用する場合、または関数パラメーターの型を として宣言する場合はそうではありませんconst
。
(b)ここで、関数のパラメーター型の意味は何ですか? const
(c)どのような状況で、参照ではなく値で渡すことを好むでしょうか(更新:別の質問になりました:C++ 11:(ラムダまたはその他の)関数オブジェクトを参照または値で渡しますか?)?
洞察をありがとう。