问题标签 [c++20]
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++ - Range TS 成语和神秘的汽车 &&
在 pre-Range TS 代码中,我可能会执行以下操作来获取对 ForwardIterator 值的(可能可修改的)引用:
这也将用于for
此类迭代器的基于范围的循环中:
但是,在基于 C++20 和 Range TS 的代码中,我看到auto&&
在这些位置有很多使用。auto&&
我从语言的角度理解正在做什么。我不明白为什么在这些地方使用它,什么时候auto&
应该可以正常工作?大多数这种性质的代码都不会转发引用,那么为什么要使用转发引用来捕获它呢?
c++ - 当迭代器(输入参数)通常不是 constexpr 时,constexpr 算法真的有用吗?
在 c++ 20 中提出,一些算法是 constexpr。
例如:
虽然我们知道迭代器通常不是 constexpr。我认为这仅在 constexpr 容器的情况下才有用。有人可以澄清我是否遗漏了什么以及我的理解是否正确?
c++ - 我的 `operator.`(操作符点)规范是否向后兼容且明确?
关于是否以及如何operator.
将标准引入c++20存在一些争论,据我所知,没有一个被接受。我想到了这个想法的直观实现
这是我尝试指定使用operator.
的调用operator.
将首先尝试访问调用对象的成员(如默认行为)。如果失败,它将调用用户定义的operator.
为了强制最小深度,用户可以调用重复.
例子:
operator.
( )的显式调用<class>.operator.().<member>
将等同于简单键入.
( <class>.<member>
)
operator.() 的返回值不必是成员。例如,它可能返回对全局对象的引用。此外,它可能比简单的 return 语句有更多的代码;
operator.
也可以用作一元运算符,其作用很像 cast/getter。以下主要内容是有效的:
由此得出(<object>.).<member>
等价于<object>..<member>
要在一元操作和二元/转发操作之间强制执行不同的行为,请使用传递给它的虚拟变量定义一元定义。
如果您希望禁止一元操作,您可以将其设置为delete
当然,允许使用通常的 const 和非 const 版本;
这种实现是否operator.
允许在所有情况下向operator.
现有类添加一个而不破坏使用它的旧代码?有没有operator.
模棱两可的情况?此外,还有一个更自以为是的问题,这种实现是否会导致任何高度不直观的结果?
c++ - Is there a accepted concept name that covers both associative and unordered associative containers?
Let's assume I have a function that accepts a container and uses the .insert or .find on it, meaning it is either unordered associative container, or associative container.
Is there a common C++ name for this kind of containers?
c++ - 是 std::weak_ptr::锁线程安全?
下面是一些显示我的用例的示例代码。我有一个 PIMPL,可以在其中共享实现(它只是一堆昂贵的数据),但是当不再需要时,可以销毁实现。该类的一个实例HasImpl
使用一个指向 的共享指针Impl
,并且该类定义包括一个static weak_ptr
to Impl
,它充当指向 的新实例的“指针分配器” HasImpl
,为它们提供一个句柄,以表明Impl
是否已经存在。
该示例有两种调用weak_ptr::lock
方式——一种假设下面问题 1-3 的答案都是“是”,另一种则不是。我更喜欢weak_ptr::lock
线程安全的唯一原因是可能有多个线程试图获取指向的指针的副本Impl
,如果lock
是线程安全的,则大多数执行线程不必传递静态变量定义(线程必须检查它是否已经初始化)并且不必竞争获取互斥锁。
- 假设它不是空的并且在遥远的过去某个时候被分配了一个指针,如果一个线程调用而另一个线程可能正在调用
std::weak_ptr
,控制块会好吗?weak_ptr::lock
weak_ptr::lock
weak_ptr::lock
在另一个线程可能将 ptr 分配给空的 weak_ptr 时调用是否足够安全?也就是说,该值将返回 nullptr 还是返回新指针?我不在乎 nullptr 是否是虚假的(也就是说,该分配已经发生,但其他线程还不知道)。我只是不想破坏控制块或从调用中获取无效的指针值。weak_ptr::lock
在对象的最后一个 shared_ptr 被销毁时调用线程安全吗?- 如果 1 到 3 有问题,
std::atomic<std::weak_ptr<T>>
C++20 会解决这个问题吗?
c++ - 为什么 `std::reference_wrapper` 在 c++17 中被弃用并在 c++20 中被删除?
从 C++11 开始,std::reference_wrapper
它是一个小的“shim”模板,它是一种类类型,可以从引用类型构造并转换为引用类型。它可以在可能不支持引用的通用容器中使用。
https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
std::reference_wrapper 是一个类模板,它将引用包装在可复制、可分配的对象中。它经常被用作将引用存储在通常不能保存引用的标准容器(如 std::vector)中的一种机制。
此标准库功能在 C++17 中已弃用,并在当前的 C++20 草案中被删除。为什么?
std::reference_wrapper
使用不安全或在某些方面存在缺陷?
在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0619r3.html#2.0
中,这似乎被认为是“D.8 旧自适应函数绑定”的一部分,并且标准描述中的文本在std::reference_wrapper
“D.9.2 Typedefs to Support Function Binders [depr.func.adaptor.typedefs]”部分中被划掉
看起来我们正在删除它,因为它在旧的函数绑定器 API 中发挥了作用,但它实际上在容器中还有其他用途,如参考页面中所述。有没有我遗漏的东西可以代替那个用例,或者我错过了关于这种情况的其他东西?
如果这个有用的特性被删除了,我们应该在需要的时候实现它,还是有某种原因表明整个模式是不安全的?
c++ - 如何在 if-else 语句中使用 C++20 的可能/不太可能属性
这个问题是关于 C++20 的[[likely]]
/[[unlikely]]
特性,而不是编译器定义的宏。
本文档 ( cppreference ) 仅给出了将它们应用于 switch-case 语句的示例。这个 switch-case 示例与我的编译器 (g++-7.2) 完美编译,所以我假设编译器已经实现了这个特性,尽管它还没有在当前的 C++ 标准中正式引入。
但是当我像这样使用它们时:if (condition) [[likely]] { ... } else { ... }
,我收到了一个警告:
“警告:语句开头的属性被忽略 [-Wattributes]”。
那么我应该如何在 if-else 语句中使用这些属性呢?
c++ - 如何将任何化合物还原为非化合物类型
要求:给定复合类型“T”,用作基本类型的非复合类型是什么?
到目前为止,我的尝试是这个模板别名:
例如
测试这一点的许多用例可能非常大。在我进一步讨论之前,我想问一下是否有人有更好的想法甚至实施?
我在问这样的事情是否合乎逻辑。这就是用例出现的地方。如果它是合乎逻辑的,那么它可以被编写。
c++ - AFT(缩写函数模板)有什么争议?
为什么这个功能如此有争议?我看到它没有与其余的 Concepts TS 一起合并到 C++20 中。在网上搜索,我找不到合理的论据,除了可以应用于几乎任何新 C++ 功能的通用论据。
人们这么害怕什么?里面可能有什么陷阱?毕竟,我们已经有了通用的 lambda。
c++ - 概念指针数组
我试图弄清楚是否可以将概念用作类的一种接口,而无需虚拟表的开销。我整理了一个可以工作的示例,但是我必须将我的类实例存储在由它们的共同继承而不是它们的共同概念定义的数组中。我没有看到关于概念数组的帖子中讨论过任何内容,但 g++ 6.3.0 似乎不允许这样做。错误是:
如果我将IShape*
数组更改为Rectangle*
数组(如导致第一个错误的行下方的注释行中),程序将按预期编译和运行。
为什么不允许使用概念指针数组?这可能会在未来的 c++ 版本中被允许吗?
(我的示例包括虚函数和继承,尽管我的目标是消除它们。我将它们包括在内只是为了方便Rectangle*
版本工作。如果我能让IShape*
版本工作,我计划删除虚函数和遗产。)
这是代码:
感谢@Yakk 关于使用元组的想法。G++ 6.3.0 尚未完全实现 #include 文件以包含 C++17 标准定义的 apply(),但它在 std::experimental 中可用。(我认为它可能会添加到更高版本的 g++ 中。)这是我最终得到的结果: