Lambda适用于最新的Visual Studio,但在其他地方不起作用
Lambda Works on Latest Visual Studio, but Doesn't Work Elsewhere
所以我已经写了一个讨厌的lambda,以满足"实现此问题所需的最短代码":
values.resize(distance(
begin(values),
remove_if(begin(values), end(values),
[i = 0U, it = cbegin(intervals), end = cend(intervals)](const auto&) mutable {
return it != end && ++i > it->first && (i <= it->second || (++it, true));
})
));
我的问题是在Visual Studio社区2015更新3版14.0.25425.01这将输出所需的内容:
4.2 9.1 2.3 0.6 6.4 3.6 1.4 7.5
但是,在我尝试过的所有其他编译器上,我得到了:
4.2 2.3 0.6 1.2 0.3 1.4 2.5 7.5
谁能告诉我是什么原因导致不同的行为?
您依靠以下事实:您传递到算法的确切闭合是用作谓词的算法,但是标准允许它复制:
[algorithms.general]/10 (N4140)
:[注意:除非另有说明,否则将功能对象作为参数允许复制的算法 这些功能对象自由。对象身份很重要的程序员应考虑使用 指向未注重实现对象的包装类别,例如Reference_wrapper(20.9.3), 或一些等效的解决方案。 - 末尾注]
这正是libstdc 所做的。来自v6.2.1:
template<typename _ForwardIterator, typename _Predicate>
_ForwardIterator
__remove_if(_ForwardIterator __first, _ForwardIterator __last,
_Predicate __pred)
{
__first = std::__find_if(__first, __last, __pred);
if (__first == __last)
return __first;
_ForwardIterator __result = __first;
++__first;
for (; __first != __last; ++__first)
if (!__pred(__first))
{
*__result = _GLIBCXX_MOVE(*__first);
++__result;
}
return __result;
}
在函数开始时呼叫std::__find_if
复制了__pred
,这意味着i
的值在std::__find_if
内有点增加,但这不会改变呼叫站点的发生。
要解决此问题,您可以使用std::ref
:
auto clos = [i = 0U, it = cbegin(intervals), end = cend(intervals)](const auto&) mutable {
return it != end && ++i > it->first && (i <= it->second || (++it, true));
};
values.resize(distance(begin(values), std::remove_if(begin(values), end(values), std::ref(clos))));
实时演示
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 在其他文件中创建类时在 c++ 项目中不起作用
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 无法打开包含文件'Graphics.hpp'没有这样的文件或目录,Visual Studio的其他包含不起作用
- 其他包含目录不起作用
- bcdedit 文件输出不起作用,但其他命令可以
- Visual Studio 2015 中的其他包含目录不起作用
- 程序在C++ Tutor中执行时有效,但在其他任何地方都不起作用
- Lambda适用于最新的Visual Studio,但在其他地方不起作用
- 海湾合作委员会 - 功能不起作用(但其他警告正在起作用)
- 代码在主类中工作,但在其他类中不起作用
- 可视化 为什么这个C++程序在某些编译器中有效,而在其他编译器中不起作用?C ++编译器之间的主要区别是什么
- 自定义顶点处理器不起作用 - 矩阵乘法错误或其他什么?
- C++:模板在其他类中不起作用
- 当我超过第一个 getline() 的输入中的数组大小时,第二个 getline 或其他输入函数不起作用
- 如果其他以及 >=(2 次)编译良好但不起作用
- CreateProcess在某些计算机上工作,而在其他计算机上不起作用.为什么
- 清理Qt布局并添加其他小部件不起作用.幽灵小部件留下来.Qt错误