Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.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标识符?_C++_Variables_Lambda_Reference_Capture - Fatal编程技术网

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); };