在Visual Studio 2012中,decltype确实是错误的吗?还是真的很难使用?

例子:

namespace ptl
{

    struct Test
    {
        Test(float ){}
    };

    template<class T, class A0>
    static T* static_constructor(void* p, A0 a0){return new(p) T(a0);}

    template<class T>
    T*  MakeVS2012Happy(T*);
}

inline auto ExampleFxn() -> decltype(ptl::MakeVS2012Happy(&ptl::static_constructor<ptl::Test, float>))
{
   return &ptl::static_constructor<ptl::Test, float>;
}
inline auto ExampleFxn2() -> decltype(&ptl::static_constructor<ptl::Test, float>)
{
   return &ptl::static_constructor<ptl::Test, float>;
}

ExampleFxn会进行编译,因为我已使用该无意义的函数将代码包装在decltype中。

ExampleFxn2不能,VS2012会显示出非常有用的错误消息:

错误C3555:“decltype”的参数不正确

有人知道是什么原因造成的吗?我似乎总是不得不与decltype对抗,以使其按预期工作……

谢谢

最佳答案

&ptl::static_constructor<ptl::Test, float>的类型可以通过decltype()推导出。这看起来像MSVC++中的错误。 clang和gcc都认为该代码很好(假设已添加#include <new>)。

10-07 12:30