C++ 类成员函数的Decltype

C++ 类成员函数的Decltype,c++,visual-studio-2010,c++11,decltype,C++,Visual Studio 2010,C++11,Decltype,此代码不在VS2010中编译: template < typename A > class X { A& m_a; public: X ( A& a ) : m_a ( a ) {} auto func ( int i ) -> decltype ( m_a ( i ) ) { return ( m_a ( i ) ); } // failing on this line }; double f ( int a ) { ret

此代码不在VS2010中编译:

template < typename A >
class X
{
    A& m_a;

public:
    X ( A& a ) : m_a ( a ) {}
    auto func ( int i ) -> decltype ( m_a ( i ) ) { return ( m_a ( i ) ); } // failing on this line
};

double f ( int a )
{
    return static_cast < double > ( a );
}

int main()
{
    X < decltype ( f ) > x ( f );
    std::cout << x.func(4) << std::endl;
    return 0;
}
模板
X类
{
A&m_A;
公众:
X(A&A):m_A(A){}
auto func(int i)->decltype(m_a(i)){return(m_a(i));}//此行失败
};
双f(整数a)
{
返回静态_cast(a);
}
int main()
{
XX(f);

std::coutVS2010没有完全按照标准规定实施
decltype
(公平地说,它比标准的最终版本旧)。您应该能够通过手工编码的
declval
来解决这个问题:

template < typename A >
class X
{
    A& m_a;
    static A& simulated_m_a();

public:
    X ( A& a ) : m_a ( a ) {}
    auto func ( int i ) -> decltype ( simulated_m_a()( i ) ) { return ( m_a ( i ) ); }
};
模板
X类
{
A&m_A;
静态A&simulated__A();
公众:
X(A&A):m_A(A){}
auto func(int i)->decltype(simulated__a()(i)){return(m_a(i));}
};

我刚刚在VS2010上验证了它的有效性。

在我的示例代码中,如果f的返回类型不是内置类型(例如std::pair),那么我会得到警告C4172。为什么?@rohisan警告来自哪里?
f
本身、
decltype()
返回
内部
func()
?这似乎是由于在X::func的定义中使用了后缀返回语法造成的。当我用实际返回类型替换后缀返回类型时,它编译时没有警告。