4

DecltypeはVisualStudio2012で本当にバグがありますか、それとも実際にはこれほど使いにくいと思われますか?

例:

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++のバグのようです。#include <new>clangとgccの両方が、コードに問題がないことに同意しています(追加されたと仮定)。

于 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 に答える