问题标签 [c++-concepts]
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++1z 中声明朋友模板类模板会产生错误:'template 的特化类 A' 必须出现在命名空间
我正在使用 boost asio 协程,我想使用新的文件系统 TS (-stdc++fs),所以我升级到 GCC 6-20151025 快照。它工作得很好。但是后来我打开了 -std=c++1z 并且在 boost 的源代码中出现了一个错误。我隔离了错误,这是一个最小的例子:
它使用 -std=c++14 编译良好,但为 -std=c++1z 生成以下错误:
我追踪了源中的错误,并且在 pt.c 中新引入的函数“maybe_new_partial_specialization”中的行为似乎有所不同。特别是在仅在概念 TS处于活动状态时才激活的情况。
在将其报告为错误之前,我想先检查这是否是 Concepts TS/C++1z 中的预期行为。
谢谢你。
编辑:根据下面的答案,事实证明这是一个错误,因此我在这里报告了它。
c++ - 有哪些 C++1z 公理的例子?
C++1z 应该在语言中引入概念(约束 + 公理)。除了已经提到的那些公理(自反性、交换性、传递性)之外,还有哪些其他公理可能有用?公理是否应该仅用于编译器优化,或者它们也可以用于不同的目的?
c++ - 如何使用带有 lambda 仿函数参数的 requires 子句?
有什么方法可以将一般要求子句应用于 lambda 仿函数的参数?
假设我有两个约束C1
,C2
并且我想检查一个参数。我希望以下内容可以工作,因为函数允许使用类似的语法:
但这不会与 GCC 6 一起编译
c++ - 无法使用带有 -std=c++0x 的 g++ 4.2.2 进行编译
当我用 g++ 4.7.2 编译它时,我使用了 c++0x 中的功能。一切正常。但我有使用 g++ 4.2.2 编译的限制,这一切都开始失败。有没有我可以使用的快速补救措施,以便编译我的“so”。
c++ - In concept definitions, are substitution failures allowed outside of a requires expression?
Consider this code:
GCC compiles it fine and prints 10.
But §14.10.1.2 Predicate constraints [temp.constr.pred] of N4553 says
A predicate constraint is a constraint that evaluates a constant expression E (5.19).
and then
After substitution, E shall have type bool.
Since C1<decltype(std::declval<A>() + std::declval<A>())>
is a substitution failure, rather than having type bool, does that mean the program should be ill-formed?
c++ - 概念和声明顺序
我一直在尝试来自 SVN 的 GCC 中的精简概念。我遇到了一个我怀疑是由于我缺乏理解的问题,如果有人能指出我正确的方向,我将不胜感激。我的代码是:
在这里,我定义了一个简单的概念,Drawable
它旨在要求给定类型的参数const T&
,函数draw(t)
编译。
然后我定义了一个draw(const std::string&)
将字符串“绘制”到cout
. 最后,我检查是否std::string
与Drawable
概念匹配——这是我预料到的,因为在调用draw()
时,适当的函数在范围内static_assert
。
draw(const std::string&)
但是,静态断言失败,除非我在概念定义之前包含声明,我不知道为什么。
这是概念上的预期行为,还是我做错了什么?
c++ - 为什么带有迭代器的构造函数要求元素是 EmplaceConstructible?
我在标准 (n4296)、23.2.3/4 (表 100) 中看到了对序列 stl 容器的要求,并阅读了一个采用参数迭代器的构造函数(X - 容器,i 和 j - 输入迭代器)
要求容器的元素类型为 EmplaceConstructible。
我认为可以通过为范围内的每个迭代器调用 std::allocator_traits::construct (m, p, *it) 方法来实现构造函数(其中 m - A 类型的分配器,p - 指向内存的指针,it - 迭代器[i; j),并且元素只有 CopyInsertable 概念是必需的,因为只为复制/移动提供了一个参数,而 EmplaceConstructible 概念要求元素从一组参数构造。这个决定有什么理由吗?
c++ - 通过隐式转换小于运算符?
考虑以下类:
我的问题是:
std::sort
C 是否可用于当前使用默认 < 运算符的标准算法?- C是否被认为满足了这个
LessThanComparable
概念? - C 是否满足要求类型为
LessThanComparable
.
c++ - #define 作为缺少概念的解决方法
这是一个库实现者在我们等待(希望)传入概念时定义宏的好主意吗?这种方法的优点和缺点是什么?
宏示例(由 A. Stepanov 撰写):
示例用法(来自我):
想法:
- 虽然没有概念,但它是一个普通的旧模板代码
- 当概念最终到达时,如果概念名称不同,您可以删除所有宏或重命名它们(您可以在任何体面的 IDE 中轻松执行此操作),然后删除或只是将这些宏重新实现为概念表达式
- 在不重写复杂的模板代码的情况下利用未来的功能
- 即使是现在,“类型化”模板参数也允许更好地理解代码并解锁开发静态概念检查工具的可能性
长话短说:A. Stepanov在 Amazon A9
的几个系列课程中,他使用这些宏在课堂上实现的算法的模板参数列表中替换关键字。被这个“面向指针的程序员”和所有 C++ 库的老大师迷住了,我开始在任何地方使用这些宏。最近有人指出宏是丑陋的(而且,迭代器有点过时了,但这是另一个故事)。所以现在我正在寻找其他专家对这种方法的建议。
typename
有问题的库示例:标准库的 GPU 加速版本(具有高性能计算的东西,如数组结构、压缩迭代器等)、线性代数库、树状数据结构、新算法函数