gpt4 book ai didi

c++ - 为什么在三元运算符的分支之间返回 lambda 对某些 lambda 有效?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:39 25 4
gpt4 key购买 nike

我想根据某些条件选择一个 lambda,但是对于某些 lambda,编译器说 lambda 的类型在三元运算符的分支之间不匹配。

编译以下代码:

int flag = 4;
auto result = flag % 2
? [](int x) {
return x + x;
}
: [](int x) {
return x * x;
};

但以下 2 个片段无法编译:

int flag = 4;
auto result = flag % 2
? [flag](int x) {
return x + flag;
}
: [flag](int x) {
return x - flag;
};

auto result2 = flag % 2
? [](auto x) {
return x + x;
}
: [](auto x) {
return x * x;
};

分别导致如下错误:

test.cpp: In function 'auto f(int)':
test.cpp:8:9: error: operands to ?: have different types 'f(int)::<lambda(int)>' and 'f(int)::<lambda(int)>'
? [flag](int x) {

test.cpp: In function 'auto f(int)':
test.cpp:10:9: error: operands to ?: have different types 'f(int)::<lambda(auto:1)>' and 'f(int)::<lambda(auto:2)>'
? [](auto x) {
^

为什么最后 2 个片段无法编译?

最佳答案

第一个片段编译是因为两个 lambda 都可以隐式转换为 int(*)(int),因此编译器可以将其用作 ?: 表达式的类型从而推断出 result 的类型。

如果捕获列表非空(情况 2),则不存在指向函数指针的此类转换(N4141 中的 5.1.2/6),因此我们最终得到两个不相关的类型,它们没有共同的隐式转换目标,如下所示operator?: 的第二个和第三个操作数,因此无法再推断出三元表达式的类型。

在案例 3 中,我们有一个通用的 lambda,如果捕获列表为空,它有一个转换运算符和一个所谓的发明模板参数列表,它定义了一组可能的转换。在我们这里的特定情况下,通用 lambda 可转换为 T2(*)(T1),其中 T1 是为参数推导的类型,T2 是 lambda 的推导返回类型。长话短说:没有从该集合中选择“最佳转换”的规则,因此编译器无法为我们的三元表达式推断出类型。

关于c++ - 为什么在三元运算符的分支之间返回 lambda 对某些 lambda 有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43156469/

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