【发布时间】:2013-06-09 18:38:40
【问题描述】:
这是我最近在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。
谁能解释我的逻辑错误?
【问题讨论】:
-
这个编译?它不应该。两个 lambdas 的类型之间没有共同的类型。
-
是的,它在 VS2012 中编译干净。我没有想到没有常见的类型,但这对我来说听起来很合理。
-
嗯,这不仅仅是报告它。照原样,没有人可以帮助您解决问题,因为我们无法重现它(它不会为我们编译!)。弄清楚是什么让你的代码编译将帮助我们解释如何解决你的问题,或者至少想出一个解决方法。
-
@R.MartinhoFernandes:我尝试了
auto x = (i < 100) ? a : b;,其中const auto a = []{return false;};和const auto b = []{return true;};在g++ 4.8 中编译。这是不正确的标准吗?即如果 lambda 的原型相同,可以这样做吗? VC++ 哭了 没有可以执行此转换的用户定义的转换运算符。 -
@legends2k 这是正确的,因为 captureless lambda 可以转换为函数指针。 AFAIK VS 还没有实现。
标签: c++ c++11 lambda conditional-operator c++-standard-library