完美的转发功能推断出冲突的错误

时间:2018-04-17 01:22:46

标签: c++ c++11 templates perfect-forwarding forwarding-reference

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

}

2 个答案:

答案 0 :(得分:2)

根据forwarding reference的扣除规则,当您尝试将TEST_EQ称为TEST_EQ(string("olleH"), s)时,对于参数string("olleH"),这是一个右值,然后{{1将推断为S;对于参数std::string,这是一个左值,然后s将推导为S。扣除结果是冲突的,然后调用失败。

您可以添加另一个模板参数以避免此类扣减冲突,例如

std::string&

LIVE

答案 1 :(得分: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));      
}