在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>
)。