问题标签 [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.

0 投票
2 回答
1458 浏览

c++ - 为什么要“移动语义”而不是简单的 memcpy?

给定以下代码:

我知道为什么这种方法通常不正确的 3 个原因(即使它避免了调用,因此避免了's 资源的src->~T()双重回收)。T

  1. U*指向U同一对象的其他成员的类型的对象成员
  2. 隐藏的类成员可能需要更新(例如,vtable)
  3. 系统需要T记录在srcTdst

(这里提到了这些:http ://www.gamedev.net/topic/655730-c-stdmove-vs-stdmemcpy/#entry5148523 。)

假设这T不是一个内存地址是其状态属性的类型(std::mutex或者std::condition_variable,例如),这些是这种方法的唯一问题吗?或者还有其他可能出错的地方吗?我想要对未知问题的描述。

我想我已经开发了一个“对象重定位语义”,但如果其中有一个明显的漏洞,我不想让人们考虑它。

0 投票
4 回答
239 浏览

c++ - 使用模板模板参数的模板参数

我目前正在使用templateC++ 中的 s 并被template template parameters.

可以说我有以下课程:

从本质上讲,我希望有一个static classlikeMyHub接受一个实现MyInterface并提供某些static方法来使用它们,比如static T Foo().

然后我尝试使用MyHub

不幸的是,我总是得到一个错误,说Tstatic T Foo()MyHub 中的)类型没有命名类型。

我希望它有效,因为

  • 模板参数的模板参数Impl命名为T
  • MyHub是具有一个模板参数并包含一个方法的模板类Foo

到目前为止,在挖掘文档和谷歌结果后,我找不到解决方案,所以我希望你们中的一些人能帮助我。

0 投票
1 回答
116 浏览

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++?

0 投票
5 回答
7520 浏览

c++ - 我可以使用 std::pair,但重命名 .first 和 .second 成员名称吗?

我遇到的一个常见设计问题是,我将两个变量捆绑在一起,然后失去以有意义的方式引用它们的能力。

我考虑过编写基本结构,但是我失去了很多随之而来的好处std::pair

  • make_pair
  • 非成员重载运算符
  • 交换
  • 得到
  • 等等

first有没有办法为和second数据成员重命名或提供替代标识符?

我希望利用所有接受的功能std::pair
但仍然可以通过以下方式使用它们:

0 投票
0 回答
82 浏览

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,它写入一个没有原子性的新值,但这并没有提供任何非原子读回值的方法。

0 投票
3 回答
629 浏览

c++ - 当模板类 is_convertible 为众所周知的类型时特化函子

所以我想在模板类型时应用特定的boost::is_convertible代码WellKnownType

为此,我考虑使用仿函数:

然后,我想在以下情况下专门使用这个函子来做其他事情boost::is_convertible<T, WellKnownType>

然后,我想我可以轻松地更改Foo定义以使用函子并在可转换为时执行某些操作,而在不可T转换WellKnownType时则不执行任何操作:

我不知道如何实现这种行为。我知道BOOST_CONCEPT_REQUIRES,但不知道如何将其应用于模板专业化。有什么帮助吗?

0 投票
3 回答
889 浏览

c++ - auto 是基于范围的 for 循环中的可选关键字吗?

我记得曾经有人告诉我,

“不需要auto内部基于范围的 for 循环。 如果我们要删除它,在语言中就不会模棱两可了。”

这是一个真实的说法吗?
以下代码是有效的 C++ 语法吗?

我以为这已经是有效的语法,但是当我用 编译时
clang++ --std=c++1z,我看到了以下错误:

编译器仍然认为这是一个基于范围的 for 循环,那么为什么它不能也派生类型呢?

0 投票
2 回答
242 浏览

c++ - 概念可以替换模板关键字的所有其他实例吗?

C++ 概念能否用于替换关键字的所有外观template
(除了概念自己的声明)?

我很好奇是否有任何理由仍然需要将关键字template用于其他语言结构,例如模板化类或模板化函数。我能想到的唯一例外是模板化类型别名。使用模板进行编译时间计算将可以通过constexpr函数替换。

为了让我的问题保持简短,
常规模板声明可以做什么,采用概念 + constexpr 无法替代?

0 投票
1 回答
157 浏览

c++ - 在 requires 参数列表中,您可以引入导致替换失败的类型吗?

例如,我可以定义一个类似的概念吗

使用 gcc 6,此代码将编译,但类似的结果Iterator<int>也会导致替换失败。这是它应该做的吗?truevalref

0 投票
0 回答
49 浏览

c++ - ContiguousIterator 的布局:成员函数列表?

对于我自己的一个类,我需要从头开始编写一个迭代器类(不使用 std::iterator)(它将是一个 ContiguousIterator)。我正在搜索所需成员的列表及其签名,因为我不知道此类迭代器应提供的所有功能以符合标准库。

我在哪里可以找到这些成员及其签名的详尽列表?