如何从自动返回类型推导出类型? [复制]

2024-03-28

这个答案 https://stackoverflow.com/a/11774533/476681有这样的代码片段:

template<class T, class F>
auto f(std::vector<T> v, F fun)
    -> decltype( bool( fun(v[0] ) ), void() )
{
  // ...
}

它确实可以编译并工作(至少在 Ideone 上 http://ideone.com/dhyxN).

那么,这种情况下类型是如何推导的呢?

c++11 标准真的允许下一行吗?

decltype( bool( fun(v[0] ) ), void() )

我快速浏览了一下,看起来不太有效。在这种情况下,ideone 错了吗?


c++11 标准中的所有示例都在 decltype 中只有一种类型:

struct A {
  char g();
  template<class T> auto f(T t) -> decltype(t + g())
  { return t + g(); }
};

另一个例子 :

void f3() {
  float x, &r = x;
  [=] {
  decltype(x) y1;
  decltype((x)) y2 = y1;
  decltype(r) r1 = y1;
  decltype((r)) r2 = y2;
};

和另一个

const int&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i;
decltype(i) x2;
decltype(a->x) x3;
decltype((a->x)) x4 = x3;

它们在 decltype 中都只有一个参数。为什么上面的代码有两个参数(用逗号分隔)?


我创建了另一个示例(无法编译):

#include <vector>
#include <iostream>

template<class T, class F>
auto f(std::vector<T> v, F fun) -> decltype(bool(fun(v[0])), void())
{
  // ...
  (void)v;(void)fun;

  return fun(v.size());
}

void ops(int)
{
}

int main(){
  std::vector<int> v;
  f(v, [](int){ return true; });
  f(v,ops);
}

即使线f(v,ops);被删除时,返回类型f模板函数被评估为 void。


decltype( bool( fun(v[0] ) ), void() )使用逗号运算符 https://stackoverflow.com/questions/54142/c-comma-operator.

分解它,

bool( fun(v[0] ) ), void()

由两个表达式组成;首先

bool( fun(v[0] ) )

is evaluated1 and discarded, giving the overall expression the value

void()

which is a value2 of type void.

decltype然后产生表达式的类型,如上所示void.

这里使用逗号运算符的原因是为了确保只有第一个子表达式有效时整个表达式才有效;这是因为如果第一个子表达式无效,则在 SFINAE 中使用它来将其排除在替换考虑之外。

这是有效的,因为虽然decltype在语法上看起来像一个函数,它实际上是一个语言结构(比如sizeof) 被定义为采用单个参数。将逗号运算符参数放在括号中可能会更清楚:

decltype( ( bool( fun(v[0] ) ), void() ) )

Notes

  1. 表达方式bool( fun(v[0] ) ) is not actually评估,因为我们处于未评估的上下文 (decltype, 如同sizeof)。这里重要的是它would be如果对整个表达式进行求值,则求值,因此,如果子表达式无效,则整个表达式也无效。
  2. void() isn't really一个值,但它的行为类似于逗号运算符上下文中的值decltype.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从自动返回类型推导出类型? [复制] 的相关文章

  • 什么是 ADO.NET?

    我编写了一些 Access 数据库并使用了一些轻型 VBA 并且有一个 OO 类 现在我正在编写一个 C 数据库应用程序 我已经安装并连接了 VS 和 System Data SQLite 并输入了我的表和列 但这就是我陷入困境的地方 我正
  • 在QT中以不同的时间间隔更新GUI [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道如何在QT中以不同的时间间隔更新GUI 最好的是我可以控制时间间隔 我知道 QTimer 可以在同一时间间隔更新 GUI 但我
  • Azure 搜索 .NET SDK 自定义分析器

    没有太多背景 这是我的问题 要使用 C 中的 NET SDK 创建新的 Azure 搜索索引 使用文档中提供的酒店示例 我的代码如下所示 public class Hotel System ComponentModel DataAnnota
  • 将自定义信息添加到 CSPROJ 文件

    作为我们开发生命周期的一部分 我们在项目中针对 C 源代码运行了许多流程 这些进程由 GUI 驱动 该 GUI 当前读取 csproj 文件以查找项目中使用的源文件 这很好用 我们现在有一个新要求 即提供一些需要调用 Web 服务的验证过程
  • 如何在线程中调用带有多个参数的方法?

    我正在构建一个 C 桌面应用程序 如何在线程中调用采用多个参数的方法 我有一个名为 Send string arg1 string arg2 string arg3 的方法 我需要使用名为 SendingThread 的线程调用此方法 有人
  • .NET类设计问题

    我有一个名为 Question 的类 它有一个名为 Type 的属性 基于这种类型 我想以特定的方式将问题呈现为html 多项选择 单选按钮 多个答案 复选框等 我从一个 RenderHtml 方法开始 该方法根据问题类型调用子方法 但我认
  • 计算串行通信的块校验字符 (BCC)

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

    根据手册页 pthread join 函数应暂停调用的执行 线程直到目标线程终止 除非目标线程 已经终止了 因此 据我了解 调用进程将阻塞 直到指定的线程退出 现在考虑以下代码 pthread t thrs NUMTHREADS for i
  • Mono.Cecil 类似 Type.GetInterfaceMap 之类的东西吗?

    系统 反射 类型包含获取接口映射 http msdn microsoft com en us library system type getinterfacemap aspx这有助于确定哪些方法从接口实现某些方法 Does 莫诺 塞西尔包含
  • Mac OS X El Capitan 可以运行为 Yosemite 编译且需要 /usr/gnu64/lib 中的库的软件吗?

    Sorry there s a bit of background necessary you could try skipping to the Question heading 自远古以来 无论如何 在上个千年的某个时候 我创建了诸如
  • 字符串初始化的 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
  • OpenSubKey 不适用于我需要的注册表值

    我安装了 SQL Server In the registry the key MSSQLServer at HKEY LOCAL MACHINE SOFTWARE Microsoft looks like this 以下所有代码行都从注册
  • C# 中的时间跨度总和

    我有一个包含 TimeSpan 变量的对象集合 MyObject TimeSpan TheDuration get set 我想使用 LINQ 来计算这些时间的总和 当然 从 MyCollection 中的 r 选择 r TheDurati
  • std::atomic 将一对原子 int32 视为一个原子 int64?

    我有一对 unsigned int32 std atomic
  • 理解 htonl() 和 ntohl()

    我正在尝试使用 unix 套接字来测试向本地主机发送一些 udp 数据包 据我了解 当设置 ip 地址和端口以发送数据包时 我会填写我的sockaddr in将值转换为网络字节顺序 我在 OSX 上 我很惊讶这个 printf ntohl
  • 起订量中的匹配设置问题

    我过去一周左右一直在使用 Moq 直到今天才遇到任何问题 我在获取时遇到问题VerifyAll 以正确匹配我的模拟的设置 我目前正在为我的应用程序的 API 编写单元测试 该应用程序的结构如下 API lt gt Service lt gt
  • 布局兼容类型的联合

    看这段代码 struct A short s int i struct B short s int i union U A a B b int fn U u u a i 1 return u b i 是否保证fn 回报1 注意 这是一个后续
  • 在 C 中实现逻辑右移

    我正在致力于仅使用按位运算符在 C 中创建逻辑右移函数 这是我所拥有的 int logical right shift int x int n int size sizeof int size of int arithmetic shift
  • VSTS 构建失败并显示 MSB4184 路径不是合法形式

    我正在尝试使用 VSTS 中的构建系统来构建和部署 c net Web 应用程序 我创建了一个新的单项目解决方案 因为似乎没有任何方法可以指定在多项目解决方案中构建 部署哪个项目 并设置我的构建定义以指向这个新解决方案 我已将其设置为使用
  • 模板编译错误 - 没有匹配的调用函数

    我正在尝试将字符串转换为数字 为此 我找到了以下方法 include

随机推荐