2017-11-06 17 views
4

私はコードが含まれている、this answerを掲載している:ラムダ識別子はどのようにキャプチャされますか?

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

しかし、私は唯一の希望:私はfirstsecond、およびthirdは本当にこのようなラムダ識別子として使用することができると考えていた

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

一定の基準で取り込む。識別子に型を指定することなく、これをどのように行うことができますか?

+0

ラムダの各インスタンスは、固有の名前のないクラスのインスタンスです。あなたはラムダ、またはそのようなものに "識別子"を割り当てることはできません。 –

+3

@Sam。私はラムダがファーストクラスのタイプであるとは反対します。そして、これは最初の質問とは関係ありません。 –

+0

あなたは疑問に思うのですが、constの値による取り込みを避けるために、const参照を取り込む方法は?ところで、そのコードの最後はひどく読めません。私はそれがこの場合には価値があるとは思わない。 – StoryTeller

答えて

4

とすることはできません。ラムダキャプチャリストにcv修飾子を入れる場所はありません。あなたはrelevant grammarを見て持つことができます。

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

それとも、あまりにもIMOの方法より読みやすいです、あなたの最初のスニペット、に固執する:あなたはしかし、何ができるか

は、名前の前に&を置くことにより、非const参照によってキャプチャです。


polygonあなたがキャプチャリストを参照することにより、それらをキャプチャする場合は、あなたの場合には、firstsecondthirdが実際constになりますので!、constですしかし、そうでない場合は、上記の理由により、いいえ。

+2

ベクトル参照ポリゴン自体がconstなので、参照はconstになります。 –

+0

@MichaëlRoyそれは本当です、これを見つけるための+1:Pありがとう – Rakete1111

+0

'ポリゴン'がconstでない場合は、['std :: as_const'](http://en.cppreference.com/w/cpp/utility/as_const)を作成します。 – Oktalist

関連する問題