c – 概念如何与通用引用相互作用?

c – 概念如何与通用引用相互作用?,第1张

概述我最近看过 this video,解释了C中概念的想法,这可能在今年作为TS出现.现在,我还了解了通用参考/转发参考(如 here所述),以及T&可以根据上下文具有两个含义(即,如果正在执行类型扣除).这自然就引发了概念如何与通用参考文献相互作用的问题? 为了具体,在下面的例子中我们有 void f(int&& i) {}int i = 0;f(i); // error, looks 我最近看过 this video,解释了C中概念的想法,这可能在今年作为TS出现.现在,我还了解了通用参考/转发参考(如 here所述),以及T&可以根据上下文具有两个含义(即,如果正在执行类型扣除).这自然就引发了概念如何与通用参考文献相互作用的问题?

为了具体,在下面的例子中我们有

voID f(int&& i) {}int i = 0;f(i);    // error,looks for f(int&)f(0);    // fine,calls f(int&&)

template <typename T>voID f(T&& test) {}int i = 0;f(i);    // fine,calls f(T&&) with T = int& (int& && = int&)f(0);    // fine,calls f(T&&) with T = int&& (int&& && = int&&)

但是如果我们使用概念会怎么样?

template <typename T>    requires Number<T>voID f(T&& test) {}template <Number T>voID g(T&& test) {}voID h(Number&& test) {}int i = 0;f(i);    // probably should be fine?f(0);    // should be fine anywayg(i);    // probably also fine?g(0);    // fine anywayh(i);    // fine or not?h(0);    // fine anyway

特别是最后一个例子让我有些困扰,因为有两个冲突
原则.首先,以这种方式使用的概念应该像一种类型一样工作,第二种是如果T是推断类型,T&&表示通用引用而不是右值引用.

感谢提前澄清这一点!

解决方法 这一切都取决于概念本身的写作. Concepts-lite本身(这篇文章是 latest TS)在这个问题上是无关紧要的:它定义了可以在语言中定义和使用概念的机制,但不向库添加库存概念.

另一方面,文件N4263 Toward a concept-enabled standard library是标准委员会的一些成员的意图声明,它表明了在Concept-lite是一个单独的TS之后的自然步骤,将概念添加到标准库中,以限制例如.算法.

那TS可能在路上有点远,但是我们仍然可以看看到目前为止写的概念.我看到的大多数例子都有一个悠久的传统,其中一切都围绕一种推定的候选类型,通常不会被认为是参考类型.例如,一些较旧的Concepts-lite草案(例如N3580)提到了诸如Container的概念,它们的根源在SGI STL,甚至在标准库中仍然存在23.2容器要求的形式.

相关类型的描述如下所示:

Value type X::value_type The type of the object stored in a container. The value type must be Assignable,but need not be DefaultConstructible.

如果我们将这个天真地转化为Concepts-lite,它可能如下所示:

template<typename X>concept bool Container = requires(X x) {   typename X::value_type;   // other requirements...};

在这种情况下,如果我们写

template<typename C>    requires Container<C>voID example(C&& c);

那么我们有以下行为:

std::vector<int> v;// fine// this checks Container<std::vector<int>>,and finds// std::vector<int>::value_typeexample(std::move(v));// not fine// this checks Container<std::vector<int>&>,and// references don't have member typesexample(v);

有几种方式来表达正确处理这种情况的value_type要求.例如.我们可以将需求调整为typename std :: remove_reference_t< X> :: value_type.

我相信委员会成员都知道情况.例如.安德鲁·萨顿(Andrew Sutton)在他的一个概念图书馆中留下了一个insightful comment,展示了确切的情况.他的首选解决方案是将概念定义保留在非引用类型上,并删除约束中的引用.对于我们的例子:

template<typename C>    // Sutton prefers std::common_type_t<C>,// effectively the same as std::decay_t<C>    requires<Container<std::remove_reference_t<C>>>voID example(C&& c);
总结

以上是内存溢出为你收集整理的c – 概念如何与通用引用相互作用?全部内容,希望文章能够帮你解决c – 概念如何与通用引用相互作用?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1233082.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存