Этот ответ имеет такой фрагмент кода:
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
оценивается как недействительный.