gpt4 book ai didi

C++11 lambda 不明确

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:22 27 4
gpt4 key购买 nike

为什么编译器不能选择最明显的重载:

#include <iostream>
#include <functional>

static void foo(const std::function<void(bool)>& f) {
std::cerr << "using bool overload" << std::endl;
f(true);
}

static void foo(const std::function<void(int)>& f) {
std::cerr << "using int overload" << std::endl;
f(1);
}

int main() {
foo([](const bool value) {
std::cout << std::boolalpha << value << std::endl;
});
foo([](const int value) {
std::cout << value << std::endl;
});
return 0;
}

你会期望输出:

using bool overload
true
using int overload
1

但是,编译器无法推断出正确的重载:

gcc-4.8:

main.cpp: In function 'int main()':
main.cpp:17:6: error: call of overloaded 'foo(main()::__lambda0)' is ambiguous
});
^
main.cpp:17:6: note: candidates are:
main.cpp:4:13: note: void foo(const std::function<void(bool)>&)
static void foo(const std::function<void(bool)>& f) {
^
main.cpp:9:13: note: void foo(const std::function<void(int)>&)
static void foo(const std::function<void(int)>& f) {
^

clang-3.4:

main.cpp:15:5: error: call to 'foo' is ambiguous
foo([](const bool value) {
^~~
main.cpp:4:13: note: candidate function
static void foo(const std::function<void(bool)>& f) {
^
main.cpp:9:13: note: candidate function
static void foo(const std::function<void(int)>& f) {
^

是不是std::function构造函数自动消费和转换参数?

最佳答案

Lambda 的语法可能很古怪,但它们仍然是仿函数。也就是说,他们定义了一个unique_type::operator()(Args...)。捕获 lambda 也是如此;捕获的值是 lambda 对象的成员。

因此,以下代码分解了一个 lambda 对象:

template<typename T, typename R, typename A>
void bar(T const& t, R (T::*pmf)(A));

template<typename LAMBDA>
void foo(LAMBDA const& l)
{
bar(l, &LAMBDA::operator());
}

显然,如果您只需要区分示例中的两个 lambda,您可以将 bar 替换为两个非模板化函数。 OTOH,如果您需要使用任意数量的参数支持 lambda,您将需要一个用于 bar 的可变参数模板。

关于C++11 lambda 不明确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19935112/

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