【发布时间】:2014-07-31 14:35:44
【问题描述】:
我对重载解析的理解是,'T&&' 通常比 'const T&' 更匹配。但是,通过这个简单的示例,我发现编译器之间存在一些不一致的行为:
#include <iostream>
void Func(const double& a)
{
(void)a;
std::cout << "[lvalue]\n";
}
void Func(double&& a)
{
(void)a;
std::cout << "[rvalue]\n";
}
template <typename T>
void TFunc(T&& a)
{
Func(a);
}
int main ()
{
TFunc(5.5f);
return 0;
}
Clang 3.2 将打印 [rvalue]。但是,VS2013 32 位/64 位编译器会打印 [lvalue]。如果我将 '5.5f' 更改为 '5.5',那么两个编译器都会打印 [lvalue].
我可以理解为什么 VS 编译器选择 'const double&' 版本,因为我没有 std::forward 调用来保留参数的 '&&'。但是,我仍然不明白是什么让 clang 认为 '&&' 重载是更好的选择。
为什么在双重转换中添加隐式浮点数会影响 clang 中的行为?谁是对的?
【问题讨论】: