我正在观看Kate Gregory创建该功能的教程:
template <class T>
T max(T& t1, T& t2)
{
return t1 < t2 ? t2 : t1;
}
并在main()中包含以下代码:
cout << "max of 33 and 44 is: " << max(33,44) << endl;
她在VC ++ Express 2010中编译并运行它,没有任何抱怨。
我在VC ++ 2013社区中尝试了相同的代码,它失败了,因为它无法找到一个带有(int,int)的最大模板。
我更正了max函数来取代参数(T const&amp; t1,T const&amp; t2)而且一切正常。
我的问题是:这个版本是特定的还是有一个编译器选项或设置允许你将文字作为非常量ref参数传递?
我可以强制代码工作的唯一方法是添加对<algorithm>
的引用,这显然会调用另一个(正确的)max版本。她的所有内容都没有在屏幕录制中完整显示,所以我猜她可能已经被骗了#39;为了简单起见,因为她没有买下const&amp; amp;但是,我会感到惊讶。
答案 0 :(得分:2)
非const左值引用不绑定到rvalues(包括除字符串文字之外的所有文字)。即使在MSVC 2010中,这(正确)也拒绝编译:
#include <iostream>
using namespace std;
template <class T>
T max(T& t1, T& t2)
{
return t1 < t2 ? t2 : t1;
}
int main(int argc, char* argv[])
{
cout << "max of 33 and 44 is: " << ::max(33,44) << endl;
//^^
return 0;
}
范围解析运算符::
强制编译器尝试使用您在全局命名空间中定义的max
。
事实上,下面的代码compiles with GCC/libstdc++ and Clang/libc++(至少在撰写本文时Coliru上的版本):
#include <iostream>
using namespace std;
template <class T>
T max(T& t1, T& t2)
{
return t1 < t2 ? t2 : t1;
}
int main(int argc, char* argv[])
{
cout << "max of 33 and 44 is: " << max(33,44) << endl;
return 0;
}
问题是那些编译器/标准库(和MSVC 2010)中的<iostream>
也被引入std::max
,由于using namespace std;
而最终被调用。 MSVC 2013的<iostream>
显然没有拉入std::max
,因此您收到错误。
有一个邪恶的MSVC扩展允许非const左值引用绑定到rvalues,但这显然不包括像int
这样的原始类型。