C++ 如何捕获Lambda标识符?
我已发布,其中包含代码:C++ 如何捕获Lambda标识符?,c++,variables,lambda,reference,capture,C++,Variables,Lambda,Reference,Capture,我已发布,其中包含代码: template <typename T> auto vertex_triangle(const size_t index, const vector<pair<T, T>>& polygon) { const auto& first = index == 0U ? polygon.back() : polygon[index - 1U]; const auto& second = polygo
template <typename T>
auto vertex_triangle(const size_t index, const vector<pair<T, T>>& polygon) {
const auto& first = index == 0U ? polygon.back() : polygon[index - 1U];
const auto& second = polygon[index];
const auto& third = index == size(polygon) - 1U ? polygon.front() : polygon[index + 1U];
return [&](auto& output){ output.push_back(first);
output.push_back(second);
output.push_back(third); };
}
但我只想通过不断的引用来捕捉。如果不在标识符中指定类型,如何执行此操作?您不能1。在lambda捕获列表中没有放置cv限定符的位置。您可以查看以下内容:
您也不能在捕获列表中指定类型(请参见上面的语法)
但是,您可以通过在名称前放置&
来通过非常量引用进行捕获:
[&first = index == 0U ? polygon.back() : polygon[index - 1U],
&second = polygon[index],
&third = index == size(polygon) - 1U ? polygon.front() : polygon[index + 1U]](auto& output){ output.push_back(first);
output.push_back(second);
output.push_back(third); };
或者只是坚持你的第一个片段,在我看来,这也更容易阅读
1
polygon
是const
,因此在您的情况下,第一个
、第二个
和第三个
如果您在捕获列表中通过引用捕获它们,它们实际上将是const
!但是如果不是,那么就不是了,原因如上所述。lambda的每个实例都是一个唯一的无名类的实例。您不能将“标识符”分配给lambda或任何类似的东西。@Sam。我不同意,lambda是一流的类型。这与最初的问题无关,所以你们的问题是,为了避免用常量值捕捉,如何捕捉常量引用?顺便说一句,最后的那段代码是非常不可读的。我认为在这种情况下不值得这么做。正如我在下面对Rakete1111的优秀答案的评论中指出的,因为所有引用都来自多边形,多边形本身就是常量引用,std::vector::front()和操作符[]将返回常量引用。@StoryTeller很难阅读,不是吗?我喜欢在lambda中完全封装可变寿命的想法。有没有更具可读性的方法来实现这一点?我想我们可以在lambda的主体中使用局部静力学,嗯?引用将是常量,因为向量引用多边形本身是常量。@MichaëlRoy这是真的,+1用于发现这个:P谢谢,如果多边形不是常量,你可以使用它。@Oktalist这也是真的,但是,您也可以在lambda:P之外定义变量
init-capture:
identifier initializer
& identifier initializer
[&first = index == 0U ? polygon.back() : polygon[index - 1U],
&second = polygon[index],
&third = index == size(polygon) - 1U ? polygon.front() : polygon[index + 1U]](auto& output){ output.push_back(first);
output.push_back(second);
output.push_back(third); };