问题标签 [c++23]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
136 浏览

c++ - 当 V 是 input_range 时,C++20lazy_split_view 是否过度约束模式?

[range.lazy.split.view]中, ( P2210之前lazy_split_view的原始C++20 )的概要定义如下:split_view

与重新设计不同的是split_view,它可以拆分input_range。根据其约束,我们可以发现when Vis input_rangePatternmust model tiny-range,其中tiny-range定义如下:

为了保证在编译时tiny-range的大小小于等于,我们必须通过它的类型来获取大小,这也要求函数是函数。1 Rsize()Rconstexpr static

而且在标准中,确实有范围类型,tiny-range例如empty_viewsingle_viewgodbolt):

但在我看来,when Vis input_range, std::array<int, 1>,span<int, 1>甚至int[1]可以是有效Pattern类型,因为我们也可以直接从类型中提取它们的大小,但是这三个都没有static size()函数,导致无法建模tiny_range

另外,由于存在以下CTAD:

V是时input_rangePattern永远不能是非view范围,因为views::all_t会产生ref_viewor owning_view,这两者都不是tiny-range甚至Pattern它自己都可以建模tiny-range天螺栓):

总之, 的定义tiny-range似乎将范围的类型限制Pattern为一个非常的集合 when Vis an input_range。标准中这样限制的原因是什么?

0 投票
1 回答
92 浏览

c++ - 如何在 C++23 中使用堆栈跟踪引发异常?

C++23 可能会通过标头引入堆栈跟踪机制<stacktrace>

我知道我们要上一std::stack_trace堂课,由他们组成std::stacktrace_entry,这一切都很好。但是 - 仅仅存在这不会有太大帮助,因为每个人都必须煞费苦心地确保他们总是收集堆栈跟踪并将其放入他们抛出的异常中。那就是……没有。

相反,我想要的是让每个 (?) 异常自动携带一个堆栈跟踪,这样当我检查或打印它时,或者即使它在没有被捕获时自动打印,堆栈跟踪也会被打印出来。

这是否计划成为可能,还是我要求太多?

0 投票
0 回答
187 浏览

c++ - 使用 using 在命名空间中定义类

上面class.pre有一个示例类定义:

标准规定

如果类头名称包含嵌套名称说明符,则该类说明符不应位于类范围内。

文本和示例似乎不同。

包含嵌套名称说明符(但仅“依赖” using )的A<void>模板的特化是否仍然符合要求?

clang 和 msvc 接受它,gcc 显示错误

错误:“模板结构 N::A”在其命名空间之外的显式特化必须使用嵌套名称说明符 [-fpermissive]

编辑:该示例似乎已经更改过一次(作为较小的编辑更改):https ://github.com/cplusplus/draft/commit/b6e0848db7a72560a7bfc84f16bd23abf6aab2d6 ([class.pre] 修复示例中的错误注释)

介绍原始措辞和示例评论的论文是http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1787r6.html(P1787R6:声明和在哪里找到它们)

纸上的那行是

0 投票
2 回答
252 浏览

c++ - 什么是 C++23 可选的一元绑定和一元返回?

C++23std::optional终于有了一些非常有用的补充。

由于我对 FP 的了解非常原始,我想知道以下两个操作的语法是什么(根据我的谷歌搜索是 2 个基本的单子操作):

  1. 一元绑定
  2. 一元回归

我最好的猜测是:

一元绑定是变换

monadic return 只是 C++17std::optional 构造函数(8)

0 投票
0 回答
129 浏览

c++ - std::ranges::views::transform 有一天会支持任何函子吗?

std::transformfrom <algorithm>header适用于范围,它“使”我们能够使用范围作为它们的函子(在范畴论的意义上(¹))。std::transform是基于迭代器的,是的,但std::ranges::views::transform不是,并且它的签名与函数式语言中相应函数的签名非常匹配,以两个参数的不同顺序为模。

当我看到这个问题(并在回答它的过程中)时,我了解到 C++23 引入了std::optional<T>::transform,它std::optional也是一个仿函数。

所有这些消息都让我兴奋不已,但我不禁想到函子是通用的,并且对transform任何函子有一个统一的接口会很好,例如 Haskell 中的情况。

这让我认为std::ranges::views::transform(它已经是一个对象而不是模板函数)可以作为一个自定义点,STL 不仅可以为范围自定义,还可以为std::optionalSTL 中的任何其他仿函数自定义,而程序员可以自定义它用于他们的用户定义的类。

非常相似,C++23 也引入了std::optional<T>::and_then,这基本上是std::optional. 我不知道有任何类似的函数为范围实现单子绑定,但 C++20some_range | std::ranges::views::transform(f) | std::ranges::views::join本质上是some_rangewith的单子绑定f

这让我觉得可能有一些通用接口,命名它mbind,可以选择任何类型。STL 会选择加入,例如,std::optional根据 实现它std::optional<T>::and_then

有没有机会,或者有没有计划有一天该语言会支持这种通用性?


我当然可以看到一些问题。今天std::ranges::views::transform(some_optional, some_func)是无效的,所以一些代码可能通过 SFINAE 依赖它。让它突然工作会破坏代码。


(¹)关于函子这个词,我指的是范畴论中给出的定义(另见this),而不是“已operator()定义的类的对象”的概念;后者在标准中的任何地方都没有定义,甚至在cppreference中也没有提到,而是使用术语FunctionObject来指代

可以在函数调用运算符左侧使用的对象

0 投票
0 回答
94 浏览

c++ - `error: 'operator() 的异常说明在处理 string_view 时“使用自身”

考虑以下代码:

run on gcc.godbolt.org

它是一个精简的迭代器,应该用作for (auto x : Iter(...))(与 完全相同fs::directory_iterator)。为简洁起见,我删除end()了所有重载的运算符,因为它们不会影响错误。

此代码使用-std=c++20(使用 GCC 和 Clang)编译,但是一旦我切换到-std=c++2bGCC 和带有 libstdc++ 的 Clang 拒绝它,而带有 libc++ 的 Clang 仍然接受它。

这是错误的要点:

如果函数未命名,则不会发生错误begin。显然return *this;考虑了string_view构造函数,它检查一些概念Iter,包括检查begin自身。

发生了什么事,我该如何解决这个错误?


报告了libstdc++ 的错误。

0 投票
1 回答
195 浏览

c++ - 为什么 basic_string_view 不限于字符类型?

浏览twitter我发现了这个 C++23 代码示例。

这是我对它的改编,以使我感兴趣的内容更加明显(我不关心回复中提到的悬空问题)。

我的问题是为什么没有一些要求/概念约束basic_string_view以使其仅适用于 char ish类型,因此basic_string_view<double>在此示例中不会编译?

0 投票
1 回答
68 浏览

c++ - 如何使用在 GCC 后备箱中?

https://github.com/gcc-mirror/gcc/commit/3acb929cc0beb79e6f4005eb22ee88b45e1cbc1d提交,C++ 标准标头<stacktrace>存在诸如std::stacktrace_entry但未声明之类的东西,因为_GLIBCXX_HAVE_STACKTRACE两者都没有定义。

我已经在https://godbolt.org/z/b9TvEMYnh上尝试过,但是一旦我添加了参数,就会发出链接器错误-lstd++_libbacktrace(ofc,它没有找到)

从提交描述中看这条消息是什么意思?:

目前,仅当使用 --enable-libstdcxx-backtrace=yes 时才会构建新库。

0 投票
2 回答
167 浏览

c++ - 为什么 C++23 stacktrace_entry 与 source_location 不同?

它们的目的基本相同,为什么它们有差异,特别是没有列stacktrace_entry,甚至不共享同一类?

0 投票
1 回答
199 浏览

c++ - 如何在不编写标识样板的情况下访问 C++23 std::optional 中包含的值?

我正在玩 C++23std::optional添加,但我不知道如何优雅地访问对象的值,如果optional它是活动的。

我知道我可以使用if,但那是C ++20。

我真的很喜欢 C++23 API 的变化,但我不知道如何跳过实现标识的样板。例如:

几乎感觉就像std::optional缺少invoke成员函数。

注意:在我的示例中,我在转换后没有链接其他任何东西,但为了简洁起见,我关心可选不被修改。