C ++ decltype无法推断出类型

时间:2012-12-29 19:42:18

标签: c++ visual-c++ c++11 decltype

在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作斗争,让它按预期工作......

由于

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

我同意Dietmar:这是编译器中的一个错误。问题似乎是decltype无法应用于采用函数模板特化的地址的表达式。也就是说,以下是此问题的最小重复:

template <typename>
void f();

typedef decltype(&f<void>) t;

作为一种解决方法,请考虑直接将decltype应用于函数模板特化,然后添加*以形成所需的指针类型:

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

请考虑在Microsoft Connect上为此打开一个错误,并在此处发布评论链接给未来的读者(或者,如果您不愿意,请告诉我,我很乐意为您打开错误这个问题)。