make_pair不适用于字符串,适用于字符串&

时间:2017-03-17 09:13:52

标签: c++ c++11

counts[k] = make_pair<string, int>(s, count_inversion(pos, 0, pos.size()));

每当使用make_pair make_pair<string,int>(s,i)时,它会出错:

error: no matching function to call for 'make_pair(std::__cxx11::string&, int)'
note: cannot convert 's' (type 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}') to type 'std::__cxx11::basic_string<char>&&'

然而make_pair<string&,int>(s,i)工作正常。有人可以解释一下。如果在后一种情况下调用s之后更改了变量make_pair,它会影响该对吗?

1 个答案:

答案 0 :(得分:6)

std::make_pair旨在使用而不使用显式指定模板参数。从C ++ 11开始,它使用完美转发,这使得手动提供模板参数非常困难(而且甚至更无意义)。

如果要根据std::make_pair的参数类型推断出对中的类型,请使用make_pair

当您想要明确控制对中的类型时,请使用std::pair<T, U>

请注意,在您的情况下,调用make_pair(s, count_inversion(pos, 0, pos.size()))实际上会将templte参数推断为string&whatever the return type of count_inversion is。这并不意味着该对将包含一个引用,它只是完美的转发行动。因此,生成的对将包含s的副本,并且不会受到s的未来更改的影响。

使用std::pair<string&, int>会有所不同,确实会为您提供对s的实时引用。