在 C 领域,std::make_pair 函数作为一种方便的函数已经崭露头角。用于创建对的工具。然而,当尝试在 C 11 中使用显式指定的模板参数使用此函数时,会出现一个特殊问题。本文深入研究了这种情况背后的神秘行为。
考虑以下内容尝试使用显式模板参数创建一对字符串和整数的代码片段:
std::pair<std::string, int>& b = std::make_pair<std::string, int>(s, 7);
而不是预期的编译成功,出现神秘错误消息:
error: no matching function for call to 'make_pair(std::string&, int)'
此错误的根源在于 std::make_pair 的错误使用。该函数旨在根据提供的参数推断模板参数。显式声明这些参数会阻碍此推理过程。
std::make_pair 的 C 11 实现采用 T&& 和 U&& 类型的两个参数,其中 T 和 U 是模板类型参数。当显式指定模板参数时,如有问题的代码所示,不会发生参数推导。相反,指定的类型会直接替换到模板声明中,从而产生以下结果:
make_pair(std::string&& argT, int&& argU);
请注意,显式指定模板中的两个参数都是右值引用 (&&),只能绑定到右值表达式。在提供的代码中, s 是一个左值(不是临时的且未被移动)。因此,函数模板无法匹配参数,从而导致编译错误。
当省略显式模板参数时,会发生参数推导。由于模板中右值引用参数的特殊性(引用折叠),A&&类型的右值引用参数(其中A是模板类型参数)可以绑定到A的任何类型。无论A是左值、右值、限定还是不是,A&& 可以绑定到它。
在示例代码中,s 是 std::string 类型的左值,7 是 int 类型的右值。编译器将 T 推断为 std::string&,将 U 推断为 int,从而允许 s 和 7 成功绑定到推断的参数类型。
要避免此类错误,请遵守遵循以下原则:如果可以从函数参数推导出模板参数,则允许编译器执行推导。明确提供参数通常是不必要的,并且可能会导致意想不到的结果。通过利用参数推导的力量,程序员可以简化代码并增强其可读性,同时保持其正确性。
以上是为什么 C 11 中的显式模板参数导致 `std::make_pair` 失败?的详细内容。更多信息请关注PHP中文网其他相关文章!