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
,它会影响该对吗?
答案 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
的实时引用。