我正在测试完美转发,我不明白为什么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);
}
答案 0 :(得分:2)
根据forwarding reference的扣除规则,当您尝试将TEST_EQ
称为TEST_EQ(string("olleH"), s)
时,对于参数string("olleH")
,这是一个右值,然后{{1将推断为S
;对于参数std::string
,这是一个左值,然后s
将推导为S
。扣除结果是冲突的,然后调用失败。
您可以添加另一个模板参数以避免此类扣减冲突,例如
std::string&
答案 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));
}