编辑 | Lisa
C++ 20 要来了!然而,大家都不看好是怎么回事儿? 为了 C++20,C++ 标准委员会曾举办历史上规模最大的一次会议(180 人参会),试图通过会议确定哪些特性可以加入新版本,我们也已经看到媒体爆料的部分新特性,比如 Concepts、Ranges、Modules、Coroutimes 等,但大部分开发人员并不认可此次调整,并将部分新特性归结为“语法糖”。
不少网友看到上述特性纷纷在社交平台吐槽,表示不看好 C++20 版本的发布:
不仅国内如此,国外的一位游戏领域开发人员接连在社交平台发表看法,声明自己不看好 C++20 的新特性,并认为新版本没有解决最关键的问题,他通过使用毕达哥拉斯三元数组示例对 C++20 标准下的代码和旧版本进行对比,明确阐述自己对于 C++20 的态度。
毕达哥拉斯三元数组,C ++ 20 Ranges 风格 以下是 C++20 标准下代码的完整示例(超长预警):
// A sample standard C++20 program that prints// the first N Pythagorean triples.#include #include #include // New header! using namespace std; // maybe_view defines a view over zero or one// objects.templatestruct maybe_view : view_interface { maybe_view() = default; maybe_view(T t) : data_(std::move(t)) { } T const *begin() const noexcept { return data_ ? &*data_ : nullptr; } T const *end() const noexcept { return data_ ? &*data_ + 1 : nullptr; }private: optional data_{};}; // "for_each" creates a new view by applying a// transformation to each element in an input// range, and flattening the resulting range of// ranges.// (This uses one syntax for constrained lambdas// in C++20.)inline constexpr auto for_each = [](R&& r, Fun fun) requires Range { return std::forward(r) | view::transform(std::move(fun)) | view::join; }; // "yield_if" takes a bool and a value and// returns a view of zero or one elements.inline constexpr auto yield_if = [](bool b, T x) { return b ? maybe_view{std::move(x)} : maybe_view{}; }; int main() { // Define an infinite range of all the // Pythagorean triples: using view::iota; auto triples = for_each(iota(1), [](int z) { return for_each(iota(1, z+1), [=](int x) { return for_each(iota(x, z+1), [=](int y) { return yield_if(x*x + y*y == z*z, make_tuple(x, y, z)); }); }); }); // Display the first 10 triples for(auto triple : triples | view::take(10)) { cout |
|