gpt4 book ai didi

c++ - 通过非常量引用将使用自动关键字声明的 lambda 作为参数传递给 std::function 参数类型

转载 作者:可可西里 更新时间:2023-11-01 16:36:58 25 4
gpt4 key购买 nike

考虑以下代码:

#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) 会产生编译错误,而其他结构却不会?如果我在它的声明中显式输入它的类型,我似乎可以通过引用传递一个 lambda,但如果我使用 auto 关键字,或者如果我将函数参数类型声明为 const

(b) 函数参数类型中的 const 是什么意思?

(c) 在什么情况下我更愿意按值传递而不是引用(更新:现在是一个单独的问题:C++11: pass (lambda or other) function object by reference or value?)?

感谢您的任何见解。

最佳答案

在您的 fizz(g1) 案例中,g1 已经是一个 std::function。因此,不需要隐式转换。所以 fizz 的参数是对 g1 的非常量引用。

fizz(g2) 中,g2 不是 std::function。因此,编译器必须执行隐式转换。并且隐式转换返回一个临时

临时对象不能绑定(bind)到非常量引用;它们只能绑定(bind)到 const 引用或值。因此编译器错误。

What does const in the function parameter type mean here?

只能调用对象的const成员,不能隐式转换为非const,也不能执行非const对其成员的操作。

你知道,就像 任何其他 const 的用法一样。

一般来说,当一个函数通过非常量引用获取一个参数时,它说明了它打算对该参数执行的操作。也就是说,您正在将一个对象交给它,并且它将用它做非常量的事情(即:修改该对象)。这就是临时对象不绑定(bind)到非常量引用的原因;这很可能是用户的错误,因为临时对象可能不会更新您传递的原始对象。

除非 fizz 实际上要修改对象,否则您应该按值或 const& 传递它。

关于c++ - 通过非常量引用将使用自动关键字声明的 lambda 作为参数传递给 std::function 参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15984453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com