Visual C ++ 2010,右值引用错误?
据我了解(我可能不完全正确;规范有点复杂),模板类型的扣除规则与您合谋。
编译器首先尝试替换所有模板(它现在还没有选择 - 只是寻找选项),并得到:
T const &r
与T = int
匹配int
lvalue,创建f(int const &)
T &&r
将int
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