Questions tagged «c++-concepts»

5
为什么我们需要需求?
C ++ 20概念的角落之一是在某些情况下您必须编写requires requires。例如,此示例来自[expr.prim.req] / 3: 甲需要表达也可以在使用需要子句([温度])作为写在模板参数特设约束,如下面的一个的一种方法: template<typename T> requires requires (T x) { x + x; } T add(T a, T b) { return a + b; } 第一个需求引入了require-clause,第二个需求引入了require-expression。 需要第二个requires关键字的技术原因是什么?为什么我们不能只允许写作: template<typename T> requires (T x) { x + x; } T add(T a, T b) { return a + …
161 c++  c++-concepts  c++20 


1
void_t“可以实现概念”吗?
我正在观看Walter Brown在CppCon2014上有关模板元编程的第二部分,在此期间他讨论了他的新颖void_t<>结构的用法。彼得·索默拉德(Peter Sommerlad)在演讲中问了我一个不太明白的问题。(链接直接指向问题,正在讨论的代码是在此之前直接进行的) 索默拉德问 沃尔特,这是否意味着我们实际上可以立即实施精简概念? 沃尔特回应 哦耶!我已经完成了...它没有完全相同的语法。 我了解这次交流是关于Concepts Lite。这种模式真的那么通用吗?无论出于什么原因,我都没有看到它。有人可以解释(或素描)这样的样子吗?这仅仅是关于enable_if和定义特征,还是提问者指的是什么? 该void_t模板定义如下: template<class ...> using void_t = void; 然后,他使用它来检测类型语句是否格式正确,并使用它来实现is_copy_assignable类型特征: //helper type template<class T> using copy_assignment_t = decltype(declval<T&>() = declval<T const&>()); //base case template template<class T, class=void> struct is_copy_assignable : std::false_type {}; //SFINAE version only for types where copy_assignment_t<T> is well-formed. template<class T> …

3
C ++ 20概念:当template参数符合多个概念时,选择哪种模板专业化?
鉴于: #include <concepts> #include <iostream> template<class T> struct wrapper; template<std::signed_integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "signed_integral" << std::endl; } }; template<std::integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "integral" << std::endl; } }; int main() { wrapper<int> w; …

1
`equality_comparable_with`是否需要要求`common_reference`?
的概念equality_­comparable_with<T, U>旨在声明类型的对象T和U可比较彼此相等,而如果是这样,则这具有预期含义。没关系。 但是,这个概念也必须common_reference_t<T&, U&>存在。对于主要推动力common_reference和随之而来的功能似乎是启用代理迭代器,有代表之间的关系的地方reference,并value_type为这样的迭代器。 太好了,但是...与a T和a是否U可以彼此相等进行测试有什么关系?为什么标准要求这样做T并U具有共同的引用关系,以使您可以比较它们相等? 这就产生了奇怪的情况,在这种情况下,很难拥有两种在逻辑上不具有合理可比性的公共参照关系的类型。例如,vector<int>并且pmr::vector<int>在逻辑上应该是可比较的。但是它们之所以不可以,是因为这两个原本不相关的类型之间没有合理的公共引用。

1
概念TS检查将忽略私有访问修饰符
我想写一个可索引的概念,意味着一个序列要么具有返回RandomAccessIterator的开始/结束,要么定义了operator []并返回非空类型的值。 我将Stroustrup的文章中的想法用于序列概念,并将其扩充为: template <class T> concept bool Indexable = Sequence<T> || requires(T t, size_t n) { { t[n] } -> NotVoid; }; 它适用于大多数情况,但不适用于以下情况: struct Bad { std::vector<int> nums; private: int& operator[](size_t ind) { return nums[ind]; } }; static_assert(!Indexable<Bad>, "fail"); 由于某种原因,我的概念忽略了operator []被定义为私有并返回true的事实。我想念什么?
10 c++  c++-concepts 

1
是否允许require表达式“捕获”封闭范围的变量?
在下面的示例中,函数自变量用于测试require表达式是否可以正确使用它们。require表达式不带参数。它直接使用函数作用域中的变量: #include <cstddef> #include <vector> template<typename T> void Resize(T &v, std::size_t const n) { if constexpr (requires { v.resize(n); }) v.resize(n); } template<typename T> void Eziser(T &v, std::size_t const n) { if constexpr (requires { v.eziser(n); }) v.eziser(n); } int main() { std::vector<int> v; Resize(v, 10u); Eziser(v, 10u); } 上面的代码使用Clang概念分支进行编译。但是,GCC10仅接受对的呼叫Resize。GCC9 …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.