在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作斗争,让它按预期工作......
由于
答案 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上为此打开一个错误,并在此处发布评论链接给未来的读者(或者,如果您不愿意,请告诉我,我很乐意为您打开错误这个问题)。