c++20相关内容
我要将范围{1, 2, 3, 4, 5}拆分为任意大小的子范围>;(例如,大小为2:{{1, 2}, {3, 4}, {5}})。 但std::views::split仅按分隔符拆分。 是否没有标准的反向联接或其他方法来执行此操作? 推荐答案 Range-v3调用此算法chunk。C++20中没有这样的范围适配器,但它是以相同名称为C++23建议的集合的一部分。For exa
..
我想定义一个可以检测T类型是否可以结构化绑定的concept: template concept two_elements_structured_bindable = requires (T t) { auto [x, y] = t; }; 但这不能编译。这样的concept有什么合适的定义吗? 推荐答案 否 结构化绑定有三种情况:
..
我正在尝试创建一个概念ElementIterable,它可以确定类型是否为嵌套区域。例如,std::vector中的元素是不可迭代的,但std::vector>中的元素(std::vector)是可迭代的。关于使用std::iterator_traits的想法出现在我的脑海中,实验代码如下所示。然而,这个ElementIterable概念
..
给定C++20中的新工具,如何向日期添加某些天数(例如n)? 当我尝试执行此操作时,出现编译时错误: auto d = July/4/2020; auto d2 = d + days{5}; ~ ^ ~~~~~~~ error: invalid operands to binary expression ('std::chrono::year_
..
我知道Range中的算法(例如sort)支持投影,但在我看来,没有办法获得视图的这种功能... 我说的对吗? 以following working code为例: #include #include #include #include enum Color { Red, Green,
..
C++20带来了更强大的iterator系统,其中之一就是在iterator_category的基础上引入iterator_concept。 我发现C++20中很多迭代器的iterator_concept和iterator_category不一致。将最著名的iota_view视为example: using R = decltype(views::iota(0)); static_as
..
clang(干线)显示以下代码错误: consteval void f() {} int main() { f(); // error: call to consteval function 'f' is not a constant expression // note: subobject of type 'void' is not initializ
..
此代码有效吗? template struct s { void f() const { } static void f() requires b { } }; void g() { s().f(); } 啪的一声说是,GCC说不是 : In function 'void g()':
..
我读了一些关于C++20的consistent comparison(即operator)的内容,但无法理解std::strong_ordering和std::weak_ordering之间的实际区别(_equality版本也是如此)。 除了描述类型的可替换性之外,它还会影响生成的代码吗?它是否添加了任何有关如何使用该类型的约束? 我很想看到一个真实的例子来证明这一点。 推荐答案
..
msvc编译以下代码(带/PERMISSIVE-COMPILER开关),clang和GCCdo not: template struct S{ static constexpr auto val = val; }; int main() { return S::val; } 我假设这只是一个msvc错误,但我很好奇标准在这里是否有歧义。 推
..
在std::span constructors上的文档中,没有一个文档接受std::矢量。 那么,此代码(source page)是如何编译的? // createSpan.cpp #include #include #include #include int main() { std::cou
..
假设我们创建了两个type_of函数,它们返回std::type_identity,like: template auto type_of() { return std::type_identity{}; } template auto type_of() { return std::type_ide
..
我试图在编译时验证给定的lambda是否接受某种类型(在我的示例代码中为Double)。只要lambda的签名明确指定了类型,它就可以工作。但是,只要我在签名中使用带有AUTO的泛型lambda,在计算Requires语句时就会出现编译错误。 以下代码片段说明了该问题(also on compiler explorer) #include #include
..
无法在最新版本的MSVC中运行此代码。此代码示例摘自艾弗·霍顿和彼得·范·韦尔特合著的《C++20入门,从新手到专业》一书。 import ; int main() { int answer {42}; std::cout
..
考虑以下代码: #include #include #include template struct is_tuple_like : std::false_type {}; template struct is_tuple_like
..
使用C++20,可以为别名模板生成演绎指南(请参阅https://en.cppreference.com/w/cpp/language/class_template_argument_deduction的别名模板演绎一节)。然而,我无法使它们使用聚合初始化语法。在这种情况下,似乎没有生成别名的扣减指南。 请参见此示例: #include template
..
一位同事向我展示了一个C++20程序,其中的闭包对象是使用std::bit_cast从它捕获的值虚拟创建的: #include #include class A { int v; public: A(int u) : v(u) {} auto getter() const { if ( v > 0 ) throw
..
我知道需求的不同,我最感兴趣的是它带来的代码质量带来的好处。 我能想到的几件事: 读者只需阅读函数签名即可知道该函数是在编译时计算的 编译器可能会发出较少的代码,因为constevalFN从不在运行时使用(这只是推测,我没有这方面的真实数据) 不需要有变量来强制ctfe,最后的示例 注意:如果代码质量太模糊,我理解有些人可能想结束这个问题,对我来说,代码质量并不是那个模糊的术
..
C++20引入了一个比较概念boolean-testable,但我注意到它的斜体和中间的连字符,表示它只用于展示,由于中没有所谓的std::boolean_testable,我们不能在我们自己的代码中使用它。 此仅展示概念的用途是什么?为什么这个概念如此神秘? 推荐答案 其目的与所有仅用于说明的概念一样,是为了简化标准中的规范。它只是一个构建块,用于指定其他(
..
我的函数GetThing如下: auto GetThing(size_t index, auto&& l1) { return l1; } auto GetThing(size_t index, auto&& l1, auto&&... rest) { if (index == 0) return l1; return GetThing(index -
..