模板或成员函数选择

SNJ*_*SNJ 6 c++ templates

我一直试图了解 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”?

son*_*yao 2

构造函数模板的参数被声明为转发引用。当传递诸如 之类的左值时line,模板参数X被推导为std::string&,并且在引用折叠之后std::string&,参数类型为 ,即对非 const 的左值引用std::string。这是完全匹配的,并且在过载解决方案中获胜。

另一方面,构造函数const std::string&需要对参数进行 const 限定,并且构造函数std::string&&不能与左值一起使用。