我一直试图了解 C++ 选择模板或成员函数的方式。考虑以下代码示例:
#include <iostream>
#include <string>
struct Test
{
template<typename X>
explicit Test( X&& s){ std::cout << "1" << std::endl;}
explicit Test( const std::string& s) { std::cout << "2"<< std::endl; }
explicit Test( std::string&& s) { std::cout << "3"<< std::endl; }
};
int main ()
{
std::string line = "TEST";
Test test( line );
}
Run Code Online (Sandbox Code Playgroud)
我在控制台上打印了“1”。如果是与参数类型匹配的非模板,为什么不选择“2”?
构造函数模板的参数被声明为转发引用。当传递诸如 之类的左值时line,模板参数X被推导为std::string&,并且在引用折叠之后std::string&,参数类型为 ,即对非 const 的左值引用std::string。这是完全匹配的,并且在过载解决方案中获胜。
另一方面,构造函数const std::string&需要对参数进行 const 限定,并且构造函数std::string&&不能与左值一起使用。