[英]C++ decltype fails to deduce type
在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對抗,以使其按預期工作...
謝謝
可以通過decltype()
推導&ptl::static_constructor<ptl::Test, float>
的類型。 這看起來像MSVC ++中的錯誤。 clang和gcc都認為代碼很好(假設添加了#include <new>
)。
我同意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上打開一個錯誤,並在此處發布鏈接作為注釋,以供將來的讀者使用(或者,如果您不願意,請告訴我,我很樂意為該問題打開一個錯誤)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.