问题标签 [c++17]
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++ - 为什么要“移动语义”而不是简单的 memcpy?
给定以下代码:
我知道为什么这种方法通常不正确的 3 个原因(即使它避免了调用,因此避免了's 资源的src->~T()
双重回收)。T
U*
指向U
同一对象的其他成员的类型的对象成员- 隐藏的类成员可能需要更新(例如,vtable)
- 系统需要
T
记录在src
T
dst
(这里提到了这些:http ://www.gamedev.net/topic/655730-c-stdmove-vs-stdmemcpy/#entry5148523 。)
假设这T
不是一个内存地址是其状态属性的类型(std::mutex
或者std::condition_variable
,例如),这些是这种方法的唯一问题吗?或者还有其他可能出错的地方吗?我想要对未知问题的描述。
我想我已经开发了一个“对象重定位语义”,但如果其中有一个明显的漏洞,我不想让人们考虑它。
c++ - 使用模板模板参数的模板参数
我目前正在使用template
C++ 中的 s 并被template template parameters
.
可以说我有以下课程:
从本质上讲,我希望有一个static class
likeMyHub
接受一个实现MyInterface
并提供某些static
方法来使用它们,比如static T Foo()
.
然后我尝试使用MyHub
:
不幸的是,我总是得到一个错误,说T
(static T Foo()
MyHub 中的)类型没有命名类型。
我希望它有效,因为
- 模板参数的模板参数
Impl
命名为T MyHub
是具有一个模板参数并包含一个方法的模板类Foo
到目前为止,在挖掘文档和谷歌结果后,我找不到解决方案,所以我希望你们中的一些人能帮助我。
c++ - Can I write a catch clause similar to abbreviated function templates?
At the top of my program, I have an exception handler.
It looks something like this:
As I obtain more an more exception types,
I'd like to take a more generic approach.
How can I apply generic programming to the Handle_All_Exceptions
function?
Would something like this be possible in newer versions of C++?
c++ - 我可以使用 std::pair,但重命名 .first 和 .second 成员名称吗?
我遇到的一个常见设计问题是,我将两个变量捆绑在一起,然后失去以有意义的方式引用它们的能力。
我考虑过编写基本结构,但是我失去了很多随之而来的好处std::pair
:
- make_pair
- 非成员重载运算符
- 交换
- 得到
- 等等
first
有没有办法为和second
数据成员重命名或提供替代标识符?
我希望利用所有接受的功能std::pair
,
但仍然可以通过以下方式使用它们:
c++ - 做跨平台联锁选项的方法还允许我有选择地绕过同步?
使用std::atomic
,似乎没有符合标准的方式来有时在没有原子性的情况下读/写。Boost 具有互锁操作,但它们在details
命名空间中,所以我认为我不应该使用它。但我不知道所有的提升。我可以使用 boost 或 stl 中的某些东西吗?或者可能是一个可以解决这个问题的提案,比如添加一个std::memory_order_no_synchronization
? 或者访问联锁机制的抽象?
似乎在许多设计中都会出现这种需求。需要线程安全的对象可能会暂时保存在单线程上下文中,从而使原子访问变得多余。例如,当第一次构造一个对象时,它通常只在创建它的线程上可见,直到放置在多个线程可以访问的某个地方。只要您的对象只能由单个线程访问,您就根本不需要std::atomic
' 安全性。但是一旦准备好,你就会将它发布到其他线程,突然你需要锁定和强制原子访问。
在这个特定的应用程序中,我正在构建大型无锁树。在构建过程中,对 interlocked 的需求为零,因此现有设计(称为 os-provided interlocked 函数)在需要时才使用 interlocked。在它对其他线程可见后,所有线程都应该使用互锁视图。std::atomic
如果不引入一堆毫无意义的同步,我就无法移植。
我现在能想到的最好的方法就是使用std::memory_order_relaxed
,但是在 ARM 上,这仍然与非原子访问不同。在 x86/amd64 上是这样。另一个技巧是placement new on std::atomic
,它写入一个没有原子性的新值,但这并没有提供任何非原子读回值的方法。
c++ - 当模板类 is_convertible 为众所周知的类型时特化函子
所以我想在模板类型时应用特定的boost::is_convertible
代码WellKnownType
:
为此,我考虑使用仿函数:
然后,我想在以下情况下专门使用这个函子来做其他事情boost::is_convertible<T, WellKnownType>
:
然后,我想我可以轻松地更改Foo
定义以使用函子并在可转换为时执行某些操作,而在不可T
转换WellKnownType
时则不执行任何操作:
我不知道如何实现这种行为。我知道BOOST_CONCEPT_REQUIRES
,但不知道如何将其应用于模板专业化。有什么帮助吗?
c++ - auto 是基于范围的 for 循环中的可选关键字吗?
我记得曾经有人告诉我,
“不需要
auto
内部基于范围的 for 循环。 如果我们要删除它,在语言中就不会模棱两可了。”
这是一个真实的说法吗?
以下代码是有效的 C++ 语法吗?
我以为这已经是有效的语法,但是当我用 编译时
clang++ --std=c++1z
,我看到了以下错误:
编译器仍然认为这是一个基于范围的 for 循环,那么为什么它不能也派生类型呢?
c++ - 概念可以替换模板关键字的所有其他实例吗?
C++ 概念能否用于替换关键字的所有外观template
(除了概念自己的声明)?
我很好奇是否有任何理由仍然需要将关键字template
用于其他语言结构,例如模板化类或模板化函数。我能想到的唯一例外是模板化类型别名。使用模板进行编译时间计算将可以通过constexpr
函数替换。
为了让我的问题保持简短,
常规模板声明可以做什么,采用概念 + constexpr 无法替代?
c++ - 在 requires 参数列表中,您可以引入导致替换失败的类型吗?
例如,我可以定义一个类似的概念吗
使用 gcc 6,此代码将编译,但类似的结果Iterator<int>
也会导致替换失败。这是它应该做的吗?true
val
ref
c++ - ContiguousIterator 的布局:成员函数列表?
对于我自己的一个类,我需要从头开始编写一个迭代器类(不使用 std::iterator)(它将是一个 ContiguousIterator)。我正在搜索所需成员的列表及其签名,因为我不知道此类迭代器应提供的所有功能以符合标准库。
我在哪里可以找到这些成员及其签名的详尽列表?