我正在观看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/

10-11 22:55
查看更多