问题标签 [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++ - 为什么在 C++23 中 allocate_at_least()?
根据cppref:
std::allocator<T>::allocate_at_least
通过调用 分配
count * sizeof(T)
未初始化存储的字节,其中count
是一个不小于 的未指定整数值(可能会提供附加参数),但未指定何时以及如何调用此函数。n
::operator new
std::align_val_t
然后,此函数在存储中创建一个类型数组
T[count]
并开始其生命周期,但不开始其任何元素的生命周期。
但是,我认为已经存在的std::allocator<T>::allocate
也可以做同样的事情。
为什么我们需要 std::allocator<T>::allocate_at_least
在 C++23 中?
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.
c++ - 为什么 C++23 std::move_only_function 没有推导指南?
C++23 引入了std::function
的表亲std::move_only_function
,就像它的名字一样,它是一个只移动可调用对象(demo)的只移动包装器:
但与 不同std::function
的是,该标准没有为其定义演绎指南(演示):
有禁止 CTAD 的理由吗?
c++ - 为什么标准 C++ 的映射中没有“指向映射值的返回指针”?
除了operator[]
和方法,在或必须使用迭代器at()
中的键查找,并且必须在使用关联值之前检查迭代器。这很公平。std::map
std::unordered_map
现在该contains()
方法已添加到这些容器中,但仅返回一个bool
.
我真的很想看到一个方法,通过成功的查找value_ptr(key)
返回指向迭代器值的指针或.second
nullptr
或者,也许更有用(使用单子操作),std::optional<value_type&> opt_value(key)
当找不到密钥时,它不包含任何内容。(自然而然,所有这些都带有 constness 的重载。)
这可能会导致对查找条件进行更自然的编码:
我认为这比:
并且比:
(作为参考,这个问题有一个提供函数模板来做这类事情的答案。)
有什么想法吗?
c++ - 显式 *this 对象参数在 C++23 中提供了什么?
在 C++23 中,推导这一点最终被添加到标准中。
根据我从提案中读到的内容,它开辟了一种创建 mixin 的新方法,并且可以创建递归 lambda。
但是我很困惑,如果这个参数创建一个“副本”而不使用模板,因为没有引用,或者显式this
参数是否有自己的值类别规则?
自从:
可能相当于:
但是它们的类型不同,因为对于&hello::func
,第一个给出void(hello::*)()
,而第二个给出void(*)(hello)
例如,我有这个简单的功能:
参数不需要this
是更改hello
类型值的引用吗?还是和以前一样基本上遵循成员函数的 cv-ref 限定符规则?
c++ - 为什么 C++23 string::resize_and_overwrite 将操作作为右值调用?
为了提高写入数据的性能std::string
,C++23专门resize_and_overwrite()
为std::string
. 在[string.capacity]中,标准对其进行了如下描述:
让
—
o = size()
在调用resize_and_overwrite
.——
k
成为min(o, n)
。—
p
是 acharT*
,使得范围 [p
,p + n
] 是有效的并且this->compare(0, k, p, k) == 0
在true
调用之前。p + k
[ , ]范围内的值p + n
可能是不确定的[basic.indet]。—
OP
是表达式std::move(op)(p, n)
。—
r = OP
.[...]
- 效果:计算,用 [ , )
OP
替换 的内容,并使对范围 [ , ]的所有指针和引用无效。*this
p
p + r
p
p + n
但是我发现这个函数在调用它之前会std::move
用来转换op
成一个右值,这意味着我们不能传入一个只有左值重载的可调用对象operator()
(demo):
这种行为似乎有点奇怪,但由于这种变化是在上一版论文中做出的,显然是故意的。
那么,这背后的考虑是什么?授权中是否有任何op
必须作为右值调用的好处?
c++ - 通过 lambda 中的显式 this 参数访问捕获的变量
从声明/函数/9.3.4.6/6.2 (我对如何引用标准中的特定句子表示歉意):
显式对象参数声明是带有 this 说明符的参数声明。显式对象参数声明应仅作为参数声明列表的第一个参数声明出现: (6.1) 声明成员函数 ([class.mem]) 的成员声明符,或 (6.2 ) 一个lambda 声明符 ([expr.prim.lambda])。
如果this
lambda 表达式允许作为显式对象参数,那么当我们同时捕获变量时会发生什么?
根据我的理解,如果我们在后台有 lambda:
可能大致相当于:
如果是对的。
例如没有。1:
- 两个表达式都有效吗?
- lambda 采用左值对象参数是否有效?
例如没有。2 以可变参数打印参数:
从评论的表达中,哪一个是有效的?
(std::cout << args << '\n', ...)
(std::cout << func.args << '\n', ...)
- 两个都
- 两者都不
如果第二个选择是有效的,那么关于 1 个对象中可能的参数包的问题值得提出另一个问题。
简而言之,在带有显式对象参数的 lambda 中使用点运算符访问的捕获变量是否有效?
c++ - C++20 中 std::ranges::split_view 的状态是什么?
根据https://en.cppreference.com/w/cpp/ranges/split_view,std::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 功能?
c++ - 概念自动转换有效吗?
从 C++20 开始,auto
通过以下方式引入约束:
这意味着,例如:
已验证。
此外,对于 new-expressions,concept 允许与 配对auto
:
auto{expr}
或auto(expr)
在 C++23 中引入,大致相当于:
这是否意味着Concept auto { expr }
或Concept auto ( expr )
也有效?
简单的用例可用于尝试创建衰减副本,同时检查由约束检查的操作。