【问题标题】:C++ decltype fails to deduce typeC++ decltype 无法推断类型
【发布时间】:2012-12-29 19:42:17
【问题描述】:

在 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 作斗争才能使其按预期工作......

谢谢

【问题讨论】:

  • 这个问题在 VC++ 2013 Update 4 中仍然存在。
  • 这种解决方法实际上效果很好!如果从MakeVS2012Happy 中删除*s,它也适用于非静态成员函数。
  • 这似乎已在 VC++ 2015 RC 中修复。

标签: c++ visual-c++ c++11 decltype


【解决方案1】:

&amp;ptl::static_constructor&lt;ptl::Test, float&gt; 的类型可以由decltype() 推断。这看起来像 MSVC++ 中的错误。 clang 和 gcc 都同意代码没问题(假设添加了#include &lt;new&gt;)。

【讨论】:

    【解决方案2】:

    我同意 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 上为此打开一个错误并在此处发布一个链接作为评论供未来的读者阅读(或者,如果您不想这样做,请告诉我,我很乐意为此问题打开一个错误)。

    【讨论】:

    • 您的解决方法适用于您的最小复制案例,并且在我使用上述代码进行的测试中。但在我的真实代码中,进行此更改并没有修复它。
    • 在您的示例中,如果“f”超载,它将无法工作。该死的 decltype 在 VS2012 中非常糟糕:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 2018-02-25
    相关资源
    最近更新 更多