问题标签 [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 投票
3 回答
572 浏览

c++ - 为什么在 C++23 中 allocate_at_least()?

根据cppref

std::allocator<T>::allocate_at_least

通过调用 分配count * sizeof(T)未初始化存储的字节,其中 count是一个不小于 的未指定整数值(可能会提供附加参数),但未指定何时以及如何调用此函数。n::operator newstd::align_val_t

然后,此函数在存储中创建一个类型数组T[count]并开始其生命周期,但不开始其任何元素的生命周期。

但是,我认为已经存在的std::allocator<T>::allocate也可以做同样的事情。

为什么我们需要 std::allocator<T>::allocate_at_least 在 C++23 中?

0 投票
1 回答
523 浏览

c++ - Why does the C++23 ranges adaptor require a callable object to be copy_­constructible?

Some ranges adaptors such as filter_­view, take_­while_­view and transform_view use std::optional's cousin copyable-box to store the callable object:

which requires the callable F to be copy_­constructible, this also prevents us from passing in the callable that captures the move only object into transform_view (Godbolt):

Since the view is not required to be copy_constructible, why do we require the callable to be copy_constructible? why don't we just use moveable-box to store callable instead of copyable-box? What are the considerations behind this?

Update:

The recent proposal P2494R0 also addresses this issue and proposes a detailed resolution.

0 投票
1 回答
604 浏览

c++ - 为什么 C++23 std::move_only_function 没有推导指南?

C++23 引入了std::function的表亲std::move_only_function,就像它的名字一样,它是一个只移动可调用对象(demo)的只移动包装器:

但与 不同std::function的是,该标准没有为其定义演绎指南(演示):

有禁止 CTAD 的理由吗?

0 投票
1 回答
88 浏览

c++ - C++ 硬件破坏性和建设性干扰大小如何与强制声明顺序一起使用?

作为参考,干扰大小是 C++17, P0154R1的一部分,并为 C++23, P1847R4提出了强制声明顺序。

据我所理解...

  • 第一个提议要求编译器将对齐的成员变量移得更近/更远。

  • 第二个建议将要求编译器按照类中的声明顺序排列成员变量。

在我看来,第二个提案比第一个提案更有优势。hardware_destructive_interference_size必然需要在两个成员变量之间留出未使用的内存,而不能选择用其他成员填充它。hardware_constructive_interference_size将减少为警告说“不能这样做,请尝试自己重新排序成员变量”。

0 投票
0 回答
58 浏览

c++ - 为什么标准 C++ 的映射中没有“指向映射值的返回指针”?

除了operator[]和方法,在或必须使用迭代器at()中的键查找,并且必须在使用关联值之前检查迭代器。这很公平。std::mapstd::unordered_map

现在该contains()方法已添加到这些容器中,但仅返回一个bool.

我真的很想看到一个方法,通过成功的查找value_ptr(key)返回指向迭代器值的指针或.secondnullptr

或者,也许更有用(使用单子操作),std::optional<value_type&> opt_value(key)当找不到密钥时,它不包含任何内容。(自然而然,所有这些都带有 constness 的重载。)

这可能会导致对查找条件进行更自然的编码:

我认为这比:

并且比:

(作为参考,这个问题有一个提供函数模板来做这类事情的答案。)

有什么想法吗?

0 投票
1 回答
155 浏览

c++ - 显式 *this 对象参数在 C++23 中提供了什么?

在 C++23 中,推导这一点最终被添加到标准中。

根据我从提案中读到的内容,它开辟了一种创建 mixin 的新方法,并且可以创建递归 lambda。

但是我很困惑,如果这个参数创建一个“副本”而不使用模板,因为没有引用,或者显式this参数是否有自己的值类别规则?

自从:

可能相当于:

但是它们的类型不同,因为对于&hello::func,第一个给出void(hello::*)(),而第二个给出void(*)(hello)

例如,我有这个简单的功能:

参数不需要this是更改hello类型值的引用吗?还是和以前一样基本上遵循成员函数的 cv-ref 限定符规则?

0 投票
1 回答
329 浏览

c++ - 为什么 C++23 string::resize_and_overwrite 将操作作为右值调用?

为了提高写入数据的性能std::string,C++23专门resize_and_overwrite()std::string. 在[string.capacity]中,标准对其进行了如下描述:

  1. o = size()在调用resize_and_overwrite.

    ——k成为min(o, n)

    p是 a charT*,使得范围 [ p, p + n] 是有效的并且this->compare(0, k, p, k) == 0true调用之前。p + k[ , ]范围内的值p + n可能是不确定的[basic.indet]

    OP是表达式std::move(op)(p, n)

    r = OP.

[...]

  1. 效果:计算,用 [ , )OP替换 的内容,并使对范围 [ , ]的所有指针和引用无效。*thispp + rpp + n

但是我发现这个函数在调用它之前会std::move用来转换op成一个右值,这意味着我们不能传入一个只有左值重载的可调用对象operator()demo):

这种行为似乎有点奇怪,但由于这种变化是在上一版论文中做出的,显然是故意的。

那么,这背后的考虑是什么?授权中是否有任何op必须作为右值调用的好处?

0 投票
1 回答
105 浏览

c++ - 通过 lambda 中的显式 this 参数访问捕获的变量

声明/函数/9.3.4.6/6.2 (我对如何引用标准中的特定句子表示歉意)

显式对象参数声明是带有 this 说明符的参数声明。显式对象参数声明应仅作为参数声明列表的第一个参数声明出现: (6.1) 声明成员函数 ([class.mem]) 的成员声明符,或 (6.2 ) 一个lambda 声明符 ([expr.prim.lambda])。

如果thislambda 表达式允许作为显式对象参数,那么当我们同时捕获变量时会发生什么?

根据我的理解,如果我们在后台有 lambda:

可能大致相当于:

如果是对的。

例如没有。1:

  • 两个表达式都有效吗?
  • lambda 采用左值对象参数是否有效?

例如没有。2 以可变参数打印参数:

从评论的表达中,哪一个是有效的?

  • (std::cout << args << '\n', ...)
  • (std::cout << func.args << '\n', ...)
  • 两个都
  • 两者都不

如果第二个选择是有效的,那么关于 1 个对象中可能的参数包的问题值得提出另一个问题。

简而言之,在带有显式对象参数的 lambda 中使用点运算符访问的捕获变量是否有效?

0 投票
1 回答
309 浏览

c++ - C++20 中 std::ranges::split_view 的状态是什么?

根据https://en.cppreference.com/w/cpp/ranges/split_viewstd::ranges::split_view必须从 C++20 开始可用。但是,同一页面上的示例在其文本中包含“C++23”:

GCC 和 MSVC 都拒绝接受 C++20 模式下的这个例子。MSVC 特别打印:

https://gcc.godbolt.org/z/4fGGb3aqY

GCC 开始接受带有-std=c++2b命令行开关的代码(意味着即将推出的 C++23),而 MSVC 即使带有/std:c++latest选项也会报告错误

演示:https ://gcc.godbolt.org/z/6z48Mz45j

C++20 模式下的示例是否有问题,或者它确实需要编译器提供一些 C++23 功能?

0 投票
0 回答
172 浏览

c++ - 概念自动转换有效吗?

从 C++20 开始,auto通过以下方式引入约束:

这意味着,例如:

已验证。

此外,对于 new-expressions,concept 允许与 配对auto

auto{expr}auto(expr)在 C++23 中引入,大致相当于:

这是否意味着Concept auto { expr }Concept auto ( expr )也有效?

简单的用例可用于尝试创建衰减副本,同时检查由约束检查的操作。