簡體   English   中英

C ++ decltype無法推斷類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM