Visual C ++ 2010,右值引用错误?


据我了解(我可能不完全正确;规范有点复杂),模板类型的扣除规则与您合谋。

编译器首先尝试替换所有模板(它现在还没有选择 - 只是寻找选项),并得到:

  • T const &rT = int匹配int lvalue,创建f(int const &)
  • T &&rint lvalue与T = int&int & &&缩减为int& ,从而创建f(int &) (规范中说明了这一点)。
  • 现在谈到选择正确的过载和后来更好的匹配,因为第一个不同的cv资格,而后者不。 这也是为什么当你删除const ,你会得到模糊的过载错误 - 重载完全一样。

    广告UPDATE1:GCC支持很多的的C ++ 0x功能。 您可以从mingw获得本机窗口或使用cygwin。

    广告UPDATE2:如果你真的需要为右值和左值分开过载,这似乎是唯一的选择。 但是大多数模板只是用任何类型的引用做正确的事情,可能使用std::forward来确保它们调用的函数的正确解析取决于它们是右值还是左值)。


    尽管你的修复并不能解决static_assert触发问题。 static_assert(false, ...)仍然会触发定义时解析模板的编译器(大部分都是这样)。

    他们会发现任何函数模板实例化都会不合格,并且标准允许他们为模板本身发布错误,而且大多数都会这样做。

    为了完成这项工作,您需要使表达式相关,以便编译器不知道它何时解析模板时总会将其计算为false。 例如

    template<class> struct false_ { static bool const value = false; };
    
    template<class T>
    T f(T &&r)
    {
        static_assert(false_<T>::value, "no way"); //< line # 10
        return r;
    }
    
    链接地址: http://www.djcxy.com/p/66531.html

    上一篇: Visual C++ 2010, rvalue reference bug?

    下一篇: type parameters to (function) templates ordered?