1

我正在测试完美转发,我不明白为什么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);

}
4

2 回答 2

2

根据转发引用的推导规则,当你尝试调用TEST_EQasTEST_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);      
}

居住

于 2018-04-17T01:36:50.093 回答
0

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

template<typename A, typename B>
static bool TEST_EQ(A&& a, B&& b) 
{
    return (forward<A>(a) == forward<B>(b));      
}
于 2018-04-17T01:44:00.983 回答