gpt4 book ai didi

c++ - 在 lambda 上使用条件运算符调用 std::any_of 会产生意想不到的结果

转载 作者:太空狗 更新时间:2023-10-29 19:58:52 27 4
gpt4 key购买 nike

这是我最近在 VS2012 中编写的一些代码:

    ///<summary>Lambda: Returns true if the field is significant within a baseline context</summary>
const auto IsSignificantBaselineField = [](const field_info & field)->bool
{
//Some lines removed here!
return something;
};

///<summary>Lambda: Returns true if the field is significant within a project context</summary>
const auto IsSignificantProjectField = [&IsSignificantBaselineField](const field_info & field)->bool
{
if (!IsSignificantBaselineField (field))
return false;

//Some lines removed here!
return something_else;
};

return std::any_of (modified_fields.begin (), modified_fields.end (), (proj_id == 0) ? IsSignificantProjectField : IsSignificantBaselineField);

奇怪的是,当“proj_id = 90000”时,IsSignificantProjectField 被 std::any_of 调用,而我的意图是在这种情况下调用 IsSignificantBaselineField。

谁能解释一下我逻辑上的错误?

最佳答案

所以我猜为什么代码可以编译并显示您观察到的行为。

lambda 都被编译器转换为结构。

没有捕获,因此没有成员和无参数构造函数。

struct IsSignificantBaselineField_Lambda {
bool operator ()(const field_info & field) { ... }
};

另一个有一个捕获,转换为一个成员和一个单参数构造函数。

struct IsSignificantProjectField_Lambda {
IsSignificantProjectField_Lambda(IsSignificantBaselineField_Lambda& capture1)
: m_capture1(capture1) {}
bool operator ()(const field_info & field) {
if (!m_capture1(field)) return false;
...
}
private:
IsSignificantBaselineField_Lambda& m_capture1;
};

我敢打赌,编译器的转换不会使该构造函数显式,从而使其成为转换构造函数,这意味着 IsSignificantBaselineField 可转换为 IsSignificantProjectField,因此 IsSignificantProjectField 是二。所以调用等同于:

return std::any_of (modified_fields.begin (), modified_fields.end (),
(proj_id == 0) ? IsSignificantProjectField :
IsSignificantProjectField_Lambda(IsSignificantBaselineField));

最终结果是两个分支做同样的事情。

这当然是一个编译器错误。

关于c++ - 在 lambda 上使用条件运算符调用 std::any_of 会产生意想不到的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17086022/

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