完善的转发功能推导出冲突错误

perfect forwarding function deduced conflicting error

我正在测试完美转发,我不明白为什么TEST_EQ(string("olleH"), s)编译失败,但string("olleH") == s编译通过。如何修复我的 TEST_EQ 功能?

template<typename S>
static bool TEST_EQ(S&& a, S&& b) 
{
    return forward<S>(a) == forward<S>(b);      
}


int main()
{
 string s= "Hello";

 cout << TEST_EQ(string("olleH"), s) << endl;
 cout << (string("olleH") == s);

}

根据forwarding reference的推导规则,当你尝试将TEST_EQ调用为TEST_EQ(string("olleH"), s)时,对于参数string("olleH"),它是一个右值,那么S 将推导为 std::string;对于参数 s,它是一个左值,那么 S 将被推导为 std::string&。推演结果冲突,调用失败

您可以添加另一个模板参数来避免这种推导冲突,例如

template<typename S, typename T>
static bool TEST_EQ(S&& a, T&& b) 
{
    // if you need to check that S and T should be the same type
    static_assert(is_same_v<remove_cvref_t<S>, remove_cvref_t<T>>, "S and T must be the same type.");

    return forward<S>(a) == forward<T>(b);      
}

LIVE

好吧,我发现我不能通过一个模板参数传递两种不同的值类型。所以这次编译,也许加一个static_assert来检查A,B类型是一个很好的解决方案。

template<typename A, typename B>
static bool TEST_EQ(A&& a, B&& b) 
{
    return (forward<A>(a) == forward<B>(b));      
}