Как тип выводится из типа автоматического возврата?

Этот ответ имеет такой фрагмент кода:

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

Он действительно компилируется и работает(по крайней мере на Идеоне).

Итак, как в этом случае выводится тип?

Действительно ли следующая строка разрешена стандартом С++ 11?

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

Я быстро посмотрел, и это не выглядит действительным. Ошибается ли ideone в этом случае?


Все примеры в стандарте c++11 таковы, что все они получили только один тип в decltype:

struct A {
  char g();
  template 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 
#include 

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

  return fun(v.size());
}

void ops(int)
{
}

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

. Даже если строка f(v,ops);удалена, возвращаемый тип функции шаблона fоценивается как недействительный.

8
задан Community 23 May 2017 в 12:03
поделиться