この回答には、次のようなコードスニペットがあります。
template<class T, class F>
auto f(std::vector<T> v, F fun)
-> decltype( bool( fun(v[0] ) ), void() )
{
// ...
}
それは実際にコンパイルされて動作します(少なくともIdeoneでは)。
では、この場合、タイプはどのように推定されますか?
次の行は本当にc++11標準で許可されていますか?
decltype( bool( fun(v[0] ) ), void() )
ざっと見てみましたが、有効ではありません。この場合、ideoneは間違っていますか?
c ++ 11標準のすべての例は、すべてdecltypeで1つの型のみを取得するようなものです。
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で1つのパラメーターのみを取得しました。トップコードが2つのパラメーター(コンマで区切られている)を受け取るのはなぜですか?
私は別の例を作成しました(コンパイルに失敗します):
#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