加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C概念相同且可分配

发布时间:2020-12-16 06:53:22 所属栏目:百科 来源:网络整理
导读:我最近一直在试验C概念.我正在尝试以下Ranges Extensions文档中的定义: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4569.pdf Same的定义和用法令我困惑.由于我不知道的原因,作者没有给出明确的定义.所以我正在使用: template class T,clas
我最近一直在试验C概念.我正在尝试以下Ranges Extensions文档中的定义:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4569.pdf

Same的定义和用法令我困惑.由于我不知道的原因,作者没有给出明确的定义.所以我正在使用:

template <class T,class U>
concept bool Same()
{
  return std::is_same<T,U>::value;
}

问题是该文档为Assignable提供了以下定义:

template <class T,class U>
concept bool Assignable()
{
  return Common<T,U>() && requires(T&& a,U&& b) {
    { std::forward<T>(a) = std::forward<U>(b) } -> Same<T&>;
  };
}

它不起作用(在GCC 6.3下):一个简单的Assignable< int&,int&&>()概念检查给我假(我已经验证了Common部分没问题).我必须改变Same< T&>对T&使它看似有效.相同的<类型>检查也用于其他一些地方.

我的问题是:

>我的定义是否正确?
>为什么Same< T&>用来代替T&?有什么区别?

谢谢你的帮助.

解决方法

在周末攻击问题后,我想我已经找到了答案.

Eric Niebler和Casey Carter有一个更精确的Same定义,它支持多个模板参数(不仅仅是两个),但我的定义基本上适用于双参数情况.

使用时 – >类型,目的是括号中的表达式可以隐式转换为Type.使用时 – >相同< Type>,目的是括号中的表达式完全是Type.所以他们是不同的.

但是,有一个问题.约束检查非常复杂,甚至像Eric和Casey这样的专家也犯了错误并在N4569中给出了错误的定义. Eric在GitHub上讨论了这个问题:

https://github.com/ericniebler/stl2/issues/330

当使用它在N4569中给出的方式时,它意味着表达式应该能够传递给想象的函数模板,如

template <typename U>
f(U)
requires Same<T&,U>()

这不起作用 – 如果传入的表达式是T的左值,则推导出的U是T而不是T&amp ;.解决方案是使用Same< T&>&&在可分配.它将产生以下想象的功能模板:

template <typename U>
f(U&&)
requires Same<T&,U>()

现在一切正常 – 如果传入的表达式是T的左值,则U必须推断为T&amp ;.

玩概念对我来说是一个很好的做法,但我可能应该早点找到他们的代码.他们在以下GitHub存储库中有一套完整的概念:

https://github.com/CaseyCarter/cmcstl2

对C概念感兴趣的人应该研究它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读