我正在观看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模板。
我更正了max函数以改用参数(T const&t1,T const&t2),一切正常。
我的问题是:是特定于版本的,还是有编译器选项或设置允许您将文字作为非常量ref参数传递?
我可以强迫代码以其他方式工作的唯一方法是添加对
<algorithm>
的引用,该引用显然会调用max的另一个(正确)版本。她的包含内容并未在屏幕录制中完整显示,因此我想为了简单起见她可能已经被“欺骗”了,因为她还没有购买const&,但我会感到惊讶。 最佳答案
非常量左值引用不绑定到右值(包括字符串文字之外的所有文字)。此(正确)即使在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左值引用绑定到右值,但显然不包括
int
之类的原始类型。关于c++ - 引用参数何时可以接受int文字?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29566456/