问题标签 [c++14]
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++14 委员会草案是否公开?
今天下午在英国布里斯托尔,ISO C++ 标准委员会采用了通用 lambda、动态数组(C99 VLA 的改进版本)、变量模板、读/写锁、make_unique、可选、标准库用户定义的文字和一些其他语言和库改进——并批准将结果作为标准 C++14 的功能完整委员会草案 (CD) 分发给其主要的国际审查投票。
我有兴趣阅读有关新功能的详细信息,但我似乎找不到比上面链接中更多的关于它们的文章。
c++ - N3600 中的“闩锁”示例中是否存在竞争条件?
建议包含在 C++14(又名 C++1y)中的是一些新的线程同步原语:锁存器和屏障。提议是
这听起来是个好主意,并且示例使它看起来对程序员非常友好。不幸的是,我认为示例代码调用了未定义的行为。该提案说latch::~latch():
破坏闩锁。如果闩锁在其他线程中
wait()或正在调用时被销毁count_down(),则行为未定义。
请注意,作为用途的描述,它说的是“in wait()”而不是“blocked in ” 。wait()count_down()
然后提供以下示例:
第二个用例的示例如下所示。我们需要加载数据,然后使用多个线程对其进行处理。加载数据受 I/O 限制,而启动线程和创建数据结构受 CPU 限制。通过并行运行这些,可以增加吞吐量。
wait()唤醒和返回的线程与离开范围时锁存器的破坏之间是否存在竞争条件?除此之外,所有的thread对象都被泄露了。count_down如果调度程序在返回之前没有运行所有工作线程并且start_latch对象离开范围,那么我认为会导致未定义的行为。大概解决方法是在返回之后但在返回之前迭代向量join()和delete所有工作线程。count_down
- 示例代码有问题吗?
- 您是否同意提案应该展示一个完整正确的示例,即使任务非常简单,以便审阅者看到使用体验会是什么样的?
注意:一个或多个工作线程似乎还没有开始等待,因此将调用wait()一个被破坏的锁存器。
更新:现在有一个新版本的提案,但代表性的例子没有改变。
c++ - C++14 中的网络库
Herb Sutter 在这里(在他的 ISO C++ 2013 年春季会议旅行报告中)写道,计划将一个网络库添加到 C++14。
这个库最初有什么功能?它的依据是什么?是否有概念验证实施?我的google-fu肯定是严重不足,因为我什至找不到提案草案。
http://meetingcpp.com/上有一系列博客文章列出了 C++14 的提案:第 1部分、第 2部分、第 3 部分和第 4 部分。在所有这些中,我只能找到两个与网络相关的提案:
- N3555 - C++ 的 URI 库(抱歉,没有链接;尽管它的前身是N3507。)
- N3603 - 三类 IP 地址提案(以及相关的早期论文N3565 - IP 地址设计约束。)
这就是全部吗?C++ 网络库是否只有这些设施?我什至不知道这些是否通过了投票,因为 Michael Wong 对同一会议的两 部分审查(布里斯托尔,2013 年 4 月)甚至没有提到它们。
c++ - GCC 二进制文字和 C++14 的区别?
C++14 似乎即将到来,编译器已经在尝试实现这个新版本的核心特性。我正在查看GCC 对这些核心功能的支持,并注意到有关二进制文字部分的一些信息:GCC 实现了它们,但似乎在 GNU 二进制文字和 C++14 二进制文字之间有所不同。以下是两者的各自参考:
我试图找到它们两者之间的一些差异,因为 GCC 似乎有所作为,但找不到任何东西。你们中的任何人都知道更多关于可能的不兼容性吗?
c++ - 用于条件变量类型和初始化的 C++1y 模板变量
我有一些看起来像这样的代码:
其他重新定义宏 DIMENSIONS 的文件包含此文件。我想要的是这样的:
我不想使用函数模板专业化或标记调度,因为 99% 的代码在这两种情况下都是相同的。我想保留我已经拥有的相同的函数组合,以及变量 a 的局部语义。所以问题是:
在这种情况下如何避免使用宏?
我可以在这里使用 C++1y 模板变量吗?下面的工作吗?
我可以在函数本身内声明模板模板变量及其特化吗?
c++ - 为什么是`make_unique` 不允许?
std始终假定命名空间。
C++14 委员会草案 N3690 是std::make_unique这样定义的:
[n3690: 20.9.1.4]:unique_ptr创建 [unique.ptr.create]
template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);1
T备注:除非不是数组,否则此函数不应参与重载决议。
2回报:unique_ptr<T>(new T(std::forward<Args>(args)...)).
template <class T> unique_ptr<T> make_unique(size_t n);3
T备注:除非是一个未知边界的数组,否则该函数不应参与重载决议。
4回报:unique_ptr<T>(new typename remove_extent<T>::type[n]()).
template <class T, class... Args> unspecified make_unique(Args&&...) = delete;5备注:此函数不应参与重载决议,除非
T是已知边界的数组。
现在,在我看来,这就像泥泞一样清晰,我认为它需要更多的阐述。但是,除了这篇社论评论,我相信我已经解码了每个变体的含义:
template <class T, class... Args> unique_ptr<T> make_unique(Args&&... args);make_unique您的非数组类型的沼泽标准。据推测,“备注”表示某种形式的静态断言或 SFINAE 技巧是为了防止模板在T为数组类型时被成功实例化。在高层次上,将其视为等效于 的智能指针
T* ptr = new T(args);。template <class T> unique_ptr<T> make_unique(size_t n);数组类型的变体。创建一个动态分配的
n×数组Ts,并将其包装在 a 中返回unique_ptr<T[]>。在高层次上,将其视为等效于 的智能指针
T* ptr = new T[n];。template <class T, class... Args> unspecified make_unique(Args&&...)不允许。“未指定”可能是
unique_ptr<T[N]>。否则将是智能指针等价于 invalid
T[N]* ptr = new (keep_the_dimension_please) (the_dimension_is_constexpr) T[N];。
首先,我说的对吗?如果是这样,第三个功能是怎么回事?
如果它不允许程序员在为每个元素提供构造函数参数的同时尝试动态分配数组(这
new int[5](args)是不可能的),那么这已经被第一个函数不能为数组类型实例化的事实所涵盖,不是吗?T[N]* ptr = new T[N]如果它的存在是为了防止像(whereNis some )这样的结构添加到语言中,constexpr那么,为什么?包装一个动态分配的× s块的a 不是完全有可能unique_ptr<T[N]>存在吗?这会是一件坏事吗,以至于委员会已经竭尽全力禁止使用.NTmake_unique
为什么make_unique<T[N]>不允许?
c++ - C++ 抽象类是不完整的类型吗?
不完整的类型不能被实例化,抽象类(即具有纯虚成员函数的类)也不能被实例化。
抽象类本身是否被认为是不完整的类型?
c++ - make_unique 数组,原始提案与最终提案
Stephan T Lavavej 最初的提议make_unique是N3588
它包括以下功能:
但是,最终提案N3656仅包括make_unique(两种形式)。我找不到关于该功能的其他形式的任何讨论。我阅读了布里斯托尔会议的记录,但他们甚至没有提及原始提案。
为什么这些额外的功能没有包含在最终草案中?
c++ - 为什么用 make_unique 调用初始化 unique_ptr?
取自:http ://herbsutter.com/2013/05/22/gotw-5-solution-overriding-virtual-functions/
我们为什么要写:
而不仅仅是:
我唯一的猜测是,如果我们想要auto,我们需要帮助它推断出正确的类型(base这里)。
如果是这样,那么对我来说,这将是一个值得怀疑的优点..在..auto的右侧键入然后键入大量初始化=
我错过了什么?