无法推断概念中的占位符类型

2024-02-02

我正在尝试使用 GCC 8 中的 Concepts TS 复制标准 C++20 概念,以便我可以在标准库中提供它们之前使用它们。我主要复制粘贴最新草稿中的所有内容,然后遇到一个问题:

#include <type_traits>
#include <utility>

// [concept.same]
template <typename T, typename U>
concept bool Same = std::is_same_v<T, U>;

// [concept.assignable]

// TODO: Proper implementation requires std::common_reference that is not in
// libstdc++ yet and implementing it myself is too hard.
template <typename LHS, typename RHS>
concept bool Assignable = std::is_lvalue_reference_v<LHS> &&
    requires(LHS lhs, RHS&& rhs)
    {
        {lhs = std::forward<RHS>(rhs)} -> Same<LHS>;
    };

template <typename T>
    requires Assignable<T&, T>
void Test(T a) {}

int main()
{
    Test(42);
}

许多其他概念需要可分配类型,当尝试使用这个概念时,我得到:

Concepts.h:54:14: note: within 'template<class LHS, class RHS> concept const bool ftz::General::Assignable<LHS, RHS> [with LHS = int&; RHS = int]'
 concept bool Assignable = std::is_lvalue_reference_v<LHS> &&
              ^~~~~~~~~~
Concepts.h:54:14: note:     with 'int& lhs'
Concepts.h:54:14: note:     with 'int&& rhs'
Concepts.h:54:14: note: unable to deduce placeholder type 'ftz::General::Same<int&>' from 'lhs =(forward<int>)(rhs)'

这里有什么问题?


这是最近对概念所做的更改,并在圣地亚哥(2018 年 11 月)采用,原因是:P1084 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1084r2.pdf。问题是以前是这样的:

{ E } -> Same<T>;

实际上意味着这个表达f(E)对于以下形式的发明函数模板有效:

template <class U> requires Same<U, T> void f(U );

这显然永远不会适用于引用类型T(如OP中所示)。

换句话说,旧规则是:{ E } -> Same<T> meant Same<remove_cvref_t<decltype((E))>, T>。新规则意味着Same<decltype((E)), T>。看来海湾合作委员会的-fconceptsclang 的概念分支也尚未实现这些新规则。


当前的解决方法是更改​​:

{ E } -> Same<LHS> // i.e. Same<T&>

to:

{ E } -> Same<std::remove_reference_t<LHS>>& // i.e. Same<T>&
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法推断概念中的占位符类型 的相关文章

随机推荐

  • 线程安全的 CopyOnWriteArrayList 反向迭代

    考虑以下代码片段 private List
  • Python Docx表行高

    因此 列宽是使用一列中所有单元格的单元格宽度来完成的 如下所示 from docx import Document from docx shared import Cm file path to file doc Document file
  • python 中 date.toordinal() 的逆是什么?

    在Python中 一个dateobject 可以这样转换为预推格里高利序数 d datetime date year 2010 month 3 day 1 d toordinal 但什么是逆操作呢 相反的是日期 fromordinal ht
  • 我可以将自定义属性传递给 NLOG 并输出到文件吗?

    编辑 4 From 似乎是 NLog 中的保留字 更改它 FromID 有效 这是一种将变量传递给 NLog 并保持代码干净的好方法 谢谢迈克 编辑3 我真的很喜欢这个主意 按照迈克的建议实现了一个辅助类 public class NLog
  • PHP 电子邮件转垃圾邮件

    我正在尝试向新注册用户发送电子邮件以进行电子邮件验证 PHP 但我不明白 为什么电子邮件会被发送到垃圾邮件 我已经检查了类似的问题 所有答案都是关于标头的 对我来说了解这些标头以及它们是如何验证的似乎有点复杂 通过发件人网站 可以说我发送为
  • 如何在Android 2.0上读取联系人

    我正在开发 Android 2 0 并试图接收所有联系人的列表 Since android provider Contacts People已弃用 我必须使用android provider ContactsContract 但我找不到如何
  • PHP preg_replace 函数替换以前的匹配项

    我有一个相当基本的情况 我有一个字符串数组 我想在单个字符串中找到这些字符串的所有匹配项 并在它们周围放置强标签 这是我到目前为止所拥有的 searchWords array test this s for i 0 i
  • Bootstrap 4:对齐卡片组内的内容

    我的 Bootstrap 4 页面中有一副纸牌 我想对齐这些按钮以获得更好的外观 我们怎样才能做到这一点 Here is an image 这是演示 http 7freres com new http 7freres com new 这张桌
  • 在笔尖而不是故事板中制作单元原型

    为了更好的可重用性 我想在故事板之外创建一个表格视图 现在当我创建一个UITableViewXcode 中基于 ViewController 和 Nib 我在 nib 文件中获得默认的 TableView 但是 我无法在 Interface
  • 在 find -execdir 中从文件名中去除 ./

    整个故事 我正在编写一个脚本 将所有文件从一个目录链接到另一个目录 新文件名将包含原始目录名 我用find此时此刻与 execdir选项 这就是我想使用它的方式 linkPictures sh 2017 wien 2017 10 它将创建一
  • 如何在 NUnit 2.5 中使用 TestCase?

    我有一个Currency我使用 NHibernate 将其保存到数据库中 Currency类看起来像这样 public class Currency Entity public virtual string Code get set pub
  • 如何在调用strcpy之前分配数组?

    Given char test bla bla bla 两者哪个更正确 char test1 malloc strlen test strcpy test1 test or char test1 malloc sizeof test str
  • 一个具有不同返回类型的函数......可以使用泛型吗?

    为了简单起见 我有一些程序 如下所示 public string FetchValueAsString string key public int FetchValueAsInteger string key public bool Fet
  • npm run 脚本中参数的 if-else

    我想调用不同的其他脚本 具体取决于是否给出参数 paramtest if z 1 then echo Foo 1 else echo Bar fi npm 运行参数测试 应该给 酒吧 npm run paramtest 无论如何 应该给出
  • 以编程方式从 Yahoo! 获取联系人地址簿[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何开始使用 MS-Build

    我希望开始使用 MS Build 到目前为止 我有很多手动构建的项目 从 Visual Studio 我想自动化构建过程 并且最好是在我不想安装 Visual Studio 的机器上进行 我开始在 MSDN 上阅读有关 MS Build 的
  • Actor 系统无响应:ThreadPoolExecutor 调度程序仅创建核心线程池,显然忽略最大线程池大小

    更新 我发现如果我设置ThreadPoolExecutor s核心池大小与最大池大小相同 29 个线程 但是 如果我将核心池大小设置为 11 最大池大小设置为 29 那么 Actor 系统只会创建 11 个线程 我该如何配置ActorSys
  • Laravel 服务提供商不受合同约束

    我有以下由服务提供商绑定的合同 接口 但是我收到以下错误 RouteDependencyResolverTrait php 第 81 行中的 ReflectionException 类 App Http Controllers Rocket
  • MongoDB/Mongoose 索引使查询更快还是更慢?

    我有一个这样的文章模型 var ArticleSchema new Schema type String title String content String hashtags String comments type Schema Ob
  • 无法推断概念中的占位符类型

    我正在尝试使用 GCC 8 中的 Concepts TS 复制标准 C 20 概念 以便我可以在标准库中提供它们之前使用它们 我主要复制粘贴最新草稿中的所有内容 然后遇到一个问题 include