问题标签 [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.
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 V
is input_range
,Pattern
must model tiny-range
,其中tiny-range
定义如下:
为了保证在编译时tiny-range
的大小小于等于,我们必须通过它的类型来获取大小,这也要求函数是函数。1
R
size()
R
constexpr
static
而且在标准中,确实有范围类型,tiny-range
例如empty_view
和single_view
(godbolt):
但在我看来,when V
is input_range
, std::array<int, 1>
,span<int, 1>
甚至int[1]
可以是有效Pattern
类型,因为我们也可以直接从类型中提取它们的大小,但是这三个都没有static size()
函数,导致无法建模tiny_range
。
另外,由于存在以下CTAD:
当V
是时input_range
,Pattern
永远不能是非view
范围,因为views::all_t
会产生ref_view
or owning_view
,这两者都不是tiny-range
甚至Pattern
它自己都可以建模tiny-range
(天螺栓):
总之, 的定义tiny-range
似乎将范围的类型限制Pattern
为一个非常小的集合 when V
is an input_range
。标准中这样限制的原因是什么?
c++ - 如何在 C++23 中使用堆栈跟踪引发异常?
C++23 可能会通过标头引入堆栈跟踪机制<stacktrace>
。
我知道我们要上一std::stack_trace
堂课,由他们组成std::stacktrace_entry
,这一切都很好。但是 - 仅仅存在这不会有太大帮助,因为每个人都必须煞费苦心地确保他们总是收集堆栈跟踪并将其放入他们抛出的异常中。那就是……没有。
相反,我想要的是让每个 (?) 异常自动携带一个堆栈跟踪,这样当我检查或打印它时,或者即使它在没有被捕获时自动打印,堆栈跟踪也会被打印出来。
这是否计划成为可能,还是我要求太多?
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:声明和在哪里找到它们)
纸上的那行是
c++ - std::ranges::views::transform 有一天会支持任何函子吗?
std::transform
from <algorithm>
header适用于范围,它“使”我们能够使用范围作为它们的函子(在范畴论的意义上(¹))。std::transform
是基于迭代器的,是的,但std::ranges::views::transform
不是,并且它的签名与函数式语言中相应函数的签名非常匹配,以两个参数的不同顺序为模。
当我看到这个问题(并在回答它的过程中)时,我了解到 C++23 引入了std::optional<T>::transform
,它std::optional
也是一个仿函数。
所有这些消息都让我兴奋不已,但我不禁想到函子是通用的,并且对transform
任何函子有一个统一的接口会很好,例如 Haskell 中的情况。
这让我认为std::ranges::views::transform
(它已经是一个对象而不是模板函数)可以作为一个自定义点,STL 不仅可以为范围自定义,还可以为std::optional
STL 中的任何其他仿函数自定义,而程序员可以自定义它用于他们的用户定义的类。
非常相似,C++23 也引入了std::optional<T>::and_then
,这基本上是std::optional
. 我不知道有任何类似的函数为范围实现单子绑定,但 C++20some_range | std::ranges::views::transform(f) | std::ranges::views::join
本质上是some_range
with的单子绑定f
。
这让我觉得可能有一些通用接口,命名它mbind
,可以选择任何类型。STL 会选择加入,例如,std::optional
根据 实现它std::optional<T>::and_then
。
有没有机会,或者有没有计划有一天该语言会支持这种通用性?
我当然可以看到一些问题。今天std::ranges::views::transform(some_optional, some_func)
是无效的,所以一些代码可能通过 SFINAE 依赖它。让它突然工作会破坏代码。
(¹)关于函子这个词,我指的是范畴论中给出的定义(另见this),而不是“已operator()
定义的类的对象”的概念;后者在标准中的任何地方都没有定义,甚至在cppreference中也没有提到,而是使用术语FunctionObject来指代
可以在函数调用运算符左侧使用的对象
c++ - `error: 'operator() 的异常说明在处理 string_view 时“使用自身”
考虑以下代码:
它是一个精简的迭代器,应该用作for (auto x : Iter(...))
(与 完全相同fs::directory_iterator
)。为简洁起见,我删除end()
了所有重载的运算符,因为它们不会影响错误。
此代码使用-std=c++20
(使用 GCC 和 Clang)编译,但是一旦我切换到-std=c++2b
GCC 和带有 libstdc++ 的 Clang 拒绝它,而带有 libc++ 的 Clang 仍然接受它。
这是错误的要点:
如果函数未命名,则不会发生错误begin
。显然return *this;
考虑了string_view
构造函数,它检查一些概念Iter
,包括检查begin
自身。
发生了什么事,我该如何解决这个错误?
报告了libstdc++ 的错误。
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 时才会构建新库。
c++ - 为什么 C++23 stacktrace_entry 与 source_location 不同?
它们的目的基本相同,为什么它们有差异,特别是没有列stacktrace_entry
,甚至不共享同一类?
c++ - 如何在不编写标识样板的情况下访问 C++23 std::optional 中包含的值?
我正在玩 C++23std::optional
添加,但我不知道如何优雅地访问对象的值,如果optional
它是活动的。
我知道我可以使用if
,但那是C ++20。
我真的很喜欢 C++23 API 的变化,但我不知道如何跳过实现标识的样板。例如:
几乎感觉就像std::optional
缺少invoke
成员函数。
注意:在我的示例中,我在转换后没有链接其他任何东西,但为了简洁起见,我关心可选不被修改。