“decltype(auto)”变量有任何实际用例吗?

2024-02-15

既来自我的个人经验,也来自咨询诸如此类的问题的答案decltype(auto) 有哪些用途? https://stackoverflow.com/questions/24109737/what-are-some-uses-of-decltypeauto我可以找到很多有价值的用例decltype(auto) as a 函数返回类型占位符.

然而,我正在认真思考任何有效的(即有用的、现实的、有价值的)用例decltype(auto)变量。我想到的唯一可能是存储函数返回的结果decltype(auto)用于以后的传播,但是auto&&也可以在那里使用,而且会更简单。

我什至搜索了我所有的项目和实验,并且出现了 391 次decltype(auto)都是返回类型占位符。

So, 有没有任何实际的用例decltype(auto)变量?或者这个功能仅在用作返回类型占位符时才有用?


你如何定义“现实”?

我正在寻找一个提供价值的用例(即,这不仅仅是一个展示该功能如何工作的示例) where decltype(auto)与诸如此类的替代品相比,是完美的选择auto&&或者根本不声明变量。

问题领域并不重要,它可能是一些晦涩的元编程案例或神秘的函数式编程结构。然而,这个例子需要让我去“嘿,这真聪明/漂亮!”使用任何其他功能来实现相同的效果将需要更多的样板或有某种缺点。


本质上,变量的情况与函数相同。这个想法是我们用 a 来存储函数调用的结果decltype(auto)多变的:

decltype(auto) result = /* function invocation */;

Then, result is

  • 如果结果是纯右值,则为非引用类型,

  • 如果结果是左值,则为(可能是 cv 限定的)左值引用类型,或者

  • 如果结果是 xvalue,则为右值引用类型。

现在我们需要一个新版本forward区分 prvalue 情况和 xvalue 情况:(名称forward避免出现 ADL 问题)

template <typename T>
T my_forward(std::remove_reference_t<T>& arg)
{
    return std::forward<T>(arg);
}

然后使用

my_forward<decltype(result)>(result)

Unlike std::forward,该函数用于转发decltype(auto)变量。因此,它不会无条件返回引用类型,并且应该使用decltype(variable),这可以是T, T&, or T&&,这样它就可以区分左值、x值和纯右值。因此,如果result is

  • 非引用类型,则使用非引用调用第二个重载T,并且返回非引用类型,从而产生纯右值;

  • 左值引用类型,然后使用 a 调用第一个重载T&, and T&返回,产生左值;

  • 右值引用类型,然后使用 a 调用第二个重载T&&, and T&&返回,产生一个 xvalue。

这是一个例子。考虑一下你想要包装std::invoke并在日志中打印一些内容:(该示例仅供说明)

template <typename F, typename... Args>
decltype(auto) my_invoke(F&& f, Args&&... args)
{
    decltype(auto) result = std::invoke(std::forward<F>(f), std::forward<Args>(args)...);
    my_log("invoke", result); // for illustration only
    return my_forward<decltype(result)>(result);
}

现在,如果调用表达式是

  • 纯右值,那么result是非引用类型,且函数返回非引用类型;

  • 一个非常量左值,那么result是一个非常量左值引用,并且该函数返回一个非常量左值引用类型;

  • 一个 const 左值,那么result是一个const左值引用,并且该函数返回一个const左值引用类型;

  • 一个 x 值,那么result是右值引用类型,并且该函数返回右值引用类型。

给定以下函数:

int f();
int& g();
const int& h();
int&& i();

以下断言成立:

static_assert(std::is_same_v<decltype(my_invoke(f)), int>);
static_assert(std::is_same_v<decltype(my_invoke(g)), int&>);
static_assert(std::is_same_v<decltype(my_invoke(h)), const int&>);
static_assert(std::is_same_v<decltype(my_invoke(i)), int&&>);

(现场演示 https://wandbox.org/permlink/GojxyLZDePXN2wZG, 仅移动测试用例 https://wandbox.org/permlink/K0KDeFT8B72dCRLt)

If auto&&相反,代码在区分纯右值和 xvalue 时会遇到一些问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“decltype(auto)”变量有任何实际用例吗? 的相关文章

  • 使用 Rijndael 加密/解密文件

    我需要传输 xml 文件 并且需要对它们进行加密 我发现一些例子认为我已经接近了 但是当我解密文件时 我最终得到了尾随垃圾字符 有一些关于此的帖子 但我还没有看到任何能真正有帮助的帖子 这是加密和解密代码 private void Encr
  • Azure 搜索 .NET SDK 自定义分析器

    没有太多背景 这是我的问题 要使用 C 中的 NET SDK 创建新的 Azure 搜索索引 使用文档中提供的酒店示例 我的代码如下所示 public class Hotel System ComponentModel DataAnnota
  • iTextSharp 居中对齐文档对象内的对象

    是否有一种快速而简单的方法可以将文档对象中的对象居中对齐 Without执行任何计算逻辑 即 获取页面宽度 获取内容宽度 除以二等 我在 Document 对象内的 Paragraph 对象中有一个 PdfPTable 对象 我想将段落对象
  • ASP.NET 中的网络凭据错误

    我正在尝试使用 NetworkCredential 类通过 ASP NET 访问网页 但是我不断收到以下消息的异常System Security Cryptography CryptographicException The handle
  • 了解编译器如何在初始化中使用普通的 {}-list

    考虑以下玩具代码 class Y public Y int int cout lt lt Y ctor n class X public X initializer list
  • linq按顺序插入元素的方法

    我有一个按元素的 Name 属性排序的元素集合 我需要在保持顺序的同时将新元素插入集合中 我正在寻找一种简洁的 LINQ 方法来做到这一点 我的代码如下 this Children 是集合 d 是我需要插入的新元素 需要两次遍历集合才能找到
  • Qt5 CMake 将所有库包含到可执行文件中

    我正在尝试使用 Qt 5 14 构建一个发布模式下的应用程序 并且 Qt Creator 内部一切正常 但是当我尝试单独运行可执行文件时 我收到如下错误 OS Windows 10 Qt 5 14 Cmake 3 5 我尝试过的 设置 CM
  • gdb 通过指向错误的代码行显示不正确的回溯

    我们可以通过在源代码中包含多个中止调用 用非常简单的示例重现此问题 在下面的示例代码中 我们在不同条件下总共有四个中止调用 但是当我们使用优化标志 O3 进行编译时 我们只能看到一个中止调用的调试信息 因此 在这四个中止调用中发生崩溃时 g
  • 窗口的打开事件和窗口句柄

    如何从刚刚打开的 Outlook 窗口获取窗口句柄 IntPtr OutLook Items items oFolder Items foreach OutLook MailItem mail in items mail Display I
  • 如果 POSIX 系统上不存在目录,是否有办法自动创建该目录?

    POSIX 系统上是否有任何方法可以仅在目录尚不存在时才自动创建该目录 如同 int fd open path to file O CREAT O EXCL O RDWR 0644 这不起作用 int dfd open path to di
  • 计算串行通信的块校验字符 (BCC)

    我通过 NET 的 SerialPort 类通过串行与设备进行通信 并且根据第三方设备规范要求 我需要计算 块检查字符 我被告知的唯一信息是 这是一个异或运算 XOR 并且必须对所有角色执行 那么 如果我有字符串 Bob 001 将如何计算
  • 如何在WPF中使用Application.Exit事件?

    我需要删除一些特定文件 然后用户关闭 WPF 中的程序 所以我从这里尝试了 MDSN 代码http msdn microsoft com en us library system windows application exit aspx
  • 如何将 C# 6 与网站项目类型一起使用?

    更新了现有的Web Site项目类型Visual Studio 2015 我将Framework更改为4 6 然后我希望在我的代码隐藏文件中可以使用所有这些新功能 不幸的是我收到如下错误 错误 CS8026 功能 表达式主体属性 在 C 5
  • Mono.Cecil 类似 Type.GetInterfaceMap 之类的东西吗?

    系统 反射 类型包含获取接口映射 http msdn microsoft com en us library system type getinterfacemap aspx这有助于确定哪些方法从接口实现某些方法 Does 莫诺 塞西尔包含
  • 字符串初始化的 gcc 诊断不一致

    我正在使用 gcc 4 9 1 Mingw 并使用以下命令编译代码 gcc test c otest exe std c11 迂腐错误 Wall Wextra 此代码给出诊断 int main void char a 5 h e l l o
  • 无法从 Windows Phone 8.1 访问 .NET 4.5 PCL 中的本地化资源

    我在访问针对 NET 4 5 的可移植类库中的本地化字符串资源时遇到问题 我允许用户在第一页上选择语言 并在其他页面上获得本地化体验 我试图通过代码获取资源来实现这一点 MyTextBloxk Text PasswordResetMetho
  • OpenSubKey 不适用于我需要的注册表值

    我安装了 SQL Server In the registry the key MSSQLServer at HKEY LOCAL MACHINE SOFTWARE Microsoft looks like this 以下所有代码行都从注册
  • 使用 Regex/C# 将 转换为

    奇怪的问题 但我不会浪费时间解释为什么我需要这样做 只是我需要这样做 我有以下内容
  • iTextSharp - 如何将 PDFPRow 添加到 PDFPTable?

    我想将 PDFPCells 数组添加到 PDFPRow 然后将 PDFPRow 添加到 PDFPTable 但我似乎无法在 PDFPTable 中找到为此的方法 然而有一个 PDFPTable AddCell 有任何想法吗 查看PdfPTa
  • 在 C 中释放 NULL 指针是一个好习惯吗? [复制]

    这个问题在这里已经有答案了 可能的重复 ptr 为 NULL 的 free ptr 是否会损坏内存 https stackoverflow com questions 1938735 does freeptr where ptr is nu

随机推荐

  • 服务在短时间内(1分钟)后被终止

    我创建了一项服务 其工作是在用户关闭应用程序时清除通知 一切都运行得很好但是有时 当应用程序在后台运行超过 1 分钟时 服务就会被终止 这意味着通知不会被取消 为什么会发生这种情况 我认为停止服务的唯一方法是使用 stopSelf 或 st
  • 基于多索引 pandas 数据框使用 matplotlib 绘制误差条

    我在 pandas 中有以下数据框 gt gt gt name Hour trt level stress date value 0 D43 9 H control 2019 06 07 0 4561 1 D43 10 H control
  • 如何摆脱 Git 子模块未跟踪状态?

    我似乎无法摆脱 Git 子模块中未跟踪的内容 跑步git status yields On branch master Changes not staged for commit use git add to update what wil
  • 为什么从初始化列表启动向量时不使用移动构造(通过隐式构造函数)

    为了演示移动语义 我编写了以下示例代码 其中包含 int 的隐式构造函数 struct C int i 0 C C int i i i C const C other i other i std cout lt lt A copy cons
  • ffmpeg函数avcodec_receive_frame总是返回EAGAIN错误

    我在iOS上使用ffmpeg解码he aac音频文件 解码器是libfdk aac 这是音频文件 https cdn perterpon com listen test bbc mp4 https cdn perterpon com lis
  • C stat 结构没有 st_ctime 字段,只有 st_ctim

    我现在已经用谷歌搜索了大约两个小时 但找不到任何有帮助的答案 手册页中指定的 stat 定义表明存在 st mtime 字段 struct stat dev t st dev ID of device containing file ino
  • 如何在android中的另一个imageview上半重叠imageview

    如何将布局 XML 文件中的图像彼此重叠一半 如下图所示 只需您就可以使用RealtiveLayout和负边距
  • 跑步后如何清理有毒环境?

    我有以下内容tox ini file tox envlist flake8 py 35 36 37 38 keyring testenv usedevelop True install command pip install U opts
  • 如何使用 google 图表 api 创建直方图?

    除了使用柱形图并适当命名之外 是否可以在谷歌图表 API 中创建直方图 添加到 mattedgod 的答案中 柱形图can现在创建的条形间隔紧密 请使用以下选项 bar groupWidth 100
  • android-如何在与主线程不同的线程中运行服务?

    我正在尝试在 android 中开发一个应用程序 其中包含一个读取多个小时传感器值的服务 当我启动服务时 我的设备挂起 所有其他进程都变慢 为了解决这个问题 我尝试在单独的线程中启动服务 如下所示 但问题仍然存在 new Thread ne
  • FB Canvas 授权重定向将我踢出 FB

    我有一个 Canvas 应用程序 它允许用户首先查看它的全部内容 然后仅在他希望执行某些操作时才请求权限 当用户进入应用程序时 它会在不需要权限的情况下启动 我们提供一个 登录 链接 该链接将请求 这会导致 Facebook 徽标出现并带有
  • 表示语法中的语句终止换行符?

    许多编程语言都有以行结束符终止的语句 不过 通常情况下 如果解析器无法理解该行 则在语句中间允许使用行结束符 例如 a 3 4 将在 Ruby 和 Python 中解析为语句a 3 4 since a 3 没有任何意义 换句话说 换行符被忽
  • 如何获取管道运行ID

    我是 Azure 新手 我需要使用 C 查找 Azure 中管道的最新活动 RunID 我不想调用管道实例 只想获取最后一个活动的 RunID 当我尝试时 可以调用管道并获取 ID 任何人都可以帮助我吗 我发现执行此操作的方法是查询数据工厂
  • Python distutils,如何获取要使用的编译器?

    例如 我可以使用python setup py build compiler msvc or python setup py build compiler mingw32要不就python setup py build 在这种情况下默认编译
  • 如何使用 Lombok 在类构造函数中使用 @Lazy 注释?

    给定一个 AnimalService 类 public class AnimalService private DogService dogService private AnimalService Lazy DogService dogS
  • 在java中连接自动生成的字符串,中间使用空格分隔符

    我有一个字符串数组变量 其值不断变化 由此生成随机数组 这就是我所拥有的 String trans Utility GetColumnValue testdata k suggest text 2 The trans值不断变化 我如何将它与
  • Pine Script 当前价格指标

    有没有办法在 Pine Script 中创建反映股票当前价格的指标 我需要这个指标 因为我需要在蜡烛收盘前 当存在特定交叉时 输入订单 并且逐条提供回测数据 我认为指标可以让我做到这一点 如果没有 还有其他方法可以解决这个问题 我不是一个经
  • Android 片段复制

    我正在尝试 android Honeycomb 预览中的新类 但遇到了一个小问题 我正在制作一个棒球计分应用程序 我希望左侧的按钮 操作菜单 可以切换右侧的 操作窗格 我已将其设置为片段 我希望按钮的 onClickListener 调用片
  • 强制我的 MFC 应用程序在 Vista 上以管理员身份运行

    我有一个使用 Visual Studio 2008 构建的 MFC 应用程序 它需要在 W2K XP 2003 和 Vista 上运行 该应用程序写入注册表中的 HKLM 并且仅在以管理员身份运行时才能在 Vista 上运行 我的问题是 我
  • “decltype(auto)”变量有任何实际用例吗?

    既来自我的个人经验 也来自咨询诸如此类的问题的答案decltype auto 有哪些用途 https stackoverflow com questions 24109737 what are some uses of decltypeau