4

decltype 在 Visual Studio 2012 中真的有问题吗,或者它实际上应该很难使用?

例子:

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 作斗争才能使其按预期工作......

谢谢

4

2 回答 2

3

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

于 2012-12-29T20:00:09.277 回答
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上为此打开一个错误,并在此处发布一个链接作为评论供未来的读者阅读(或者,如果您不想这样做,请告诉我,我很乐意为此问题打开一个错误)。

于 2012-12-29T20:09:50.237 回答