Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在lambda上使用条件运算符调用std::any_of会产生意外的结果_C++_C++11_Lambda_Conditional Operator_C++ Standard Library - Fatal编程技术网

C++ 在lambda上使用条件运算符调用std::any_of会产生意外的结果

C++ 在lambda上使用条件运算符调用std::any_of会产生意外的结果,c++,c++11,lambda,conditional-operator,c++-standard-library,C++,C++11,Lambda,Conditional Operator,C++ Standard Library,以下是我最近在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 r

以下是我最近在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);
///Lambda:如果字段在基线上下文中很重要,则返回true
常量自动分配重要基线字段=[](常量字段信息和字段)->bool
{
//这里删除了一些行!
归还某物;
};
///Lambda:如果字段在项目上下文中很重要,则返回true
const auto-IsSignificantProjectField=[&IsSignificantBaselineField](const field_信息和字段)->bool
{
如果(!IsSignificantBaselineField(字段))
返回false;
//这里删除了一些行!
归还其他东西;
};
return std::任意(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;
};
另一个有一个捕获,转换为一个成员和一个arg构造函数

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));
最终的效果是两个分支做相同的事情


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

这会编译吗?不应该。两个lambda的类型之间没有共同的类型。是的,它在VS2012中编译得很干净。我没有想到没有常见的类型,但这听起来很合理。好吧,这不仅仅是报告。事实上,没有人能够帮助解决您的问题,因为我们无法复制它(它不能为我们编译!)。找出代码编译的原因有助于我们解释如何解决您的问题,或者至少找到一个解决方法。@R.MartinhoFernandes:我试过
autox=(I<100)?a:b其中
const auto a=[]{return false;}
常量自动b=[]{return true;}在g++4.8中编译。按照标准,这是不正确的吗?i、 e.如果lambda的原型相同,可以这样做吗?VC++没有可执行此转换的用户定义的转换运算符。@legends2k这是正确的,因为无捕获lambda可转换为函数指针。AFAIK VS还没有实现这一点。太棒了——推断得很好!这很可能是正确的解释。