首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从自动返回类型中推断类型?

如何从自动返回类型中推断类型?
EN

Stack Overflow用户
提问于 2012-08-02 10:29:24
回答 1查看 962关注 0票数 8

这个答案有如下代码片段:

代码语言:javascript
复制
template<class T, class F>
auto f(std::vector<T> v, F fun)
    -> decltype( bool( fun(v[0] ) ), void() )
{
  // ...
}

它确实编译和工作(至少在Ideone上)。

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

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

代码语言:javascript
复制
decltype( bool( fun(v[0] ) ), void() )

我快速地看了一眼,看起来不太有效。这件事有什么不对吗?

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

代码语言:javascript
复制
struct A {
  char g();
  template<class T> auto f(T t) -> decltype(t + g())
  { return t + g(); }
};

另一个例子是:

代码语言:javascript
复制
void f3() {
  float x, &r = x;
  [=] {
  decltype(x) y1;
  decltype((x)) y2 = y1;
  decltype(r) r1 = y1;
  decltype((r)) r2 = y2;
};

还有另一个

代码语言:javascript
复制
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;

他们都只有一个解密类型的参数。为什么最上面的代码有两个参数(用逗号分隔)?

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

代码语言:javascript
复制
#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模板函数的返回类型也会被计算为无效。

EN

回答 1

Stack Overflow用户

发布于 2012-08-02 10:42:20

decltype生成括号之间的表达式类型,即,而不实际计算(请记住这一点,以供后面的部分使用)。

,运算符计算左参数/表达式,抛出结果,计算右参数,并生成该结果。因此,返回类型变成void

对于bool(fun(v[0]))部分,这是相当容易的。bool(f(...))从调用f的结果构造bool临时。如果返回类型的f不能转换为bool,这将触发一个错误,这将导致decltype (这称为“SFINAE”)内部的SFINAE。

f(v[0])将把v[0]的返回值传递给类型为T&f。如果f没有一个可转换为T&的参数,或者接受更多/更少的参数,这将触发一个错误,并再次导致基于上述原因的SFINAE。

(如果std::vector不支持operator[],也会发生同样的情况。)

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11775639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档