yieldのファミリでは、どのような理由からデフォルトのコンストラクタが必要なのかについて理解しようとしていますか?range-v3 yieldにデフォルトのコンストラクタが必要なのはなぜですか?
次の例では、vnums1行は、CNumにデフォルトコンストラクタがある場合にのみコンパイルされます。 vnums2行には、デフォルトのコンストラクタは必要ありません。
私はVisual Studio 2017とRange-V3-VS2015を使用しています。ありがとうございました!
#include <range/v3/all.hpp>
struct CNum
{
// CNum() = default;
explicit CNum(int num) : m_num(num) {}
int m_num;
};
int main()
{
auto ints = ranges::view::ints(0, 10);
// this compiles only of CNum has a default constructor
auto vnums1 = ints
| ranges::view::for_each([](int num) { return ranges::yield_if(num % 2, CNum(num)); })
| ranges::to_vector;
// this compiles even if CNum does not have a default constructor
auto vnums2 = ints
| ranges::view::remove_if([](int num) { return num % 2 == 0; })
| ranges::view::transform([](int num) { return CNum(num); })
| ranges::to_vector;
return 0;
}
これは素晴らしいことです。ありがとうございました。 Microsoft/Range-V3-VS2015のメンテナはericniebler/range-v3から新しい変更を取得していません。 VC++ 2017で動作する最新のビットをどうやって得ることができるかについて誰かが提案していますか? – CodeAndLearn
悲しいことに、Microsoft/Range-V3-VS2015レポをフォークして、自分で変更を加えることをお勧めします。 –