完善的转发功能推导出冲突错误
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);
}
好吧,我发现我不能通过一个模板参数传递两种不同的值类型。所以这次编译,也许加一个static_assert来检查A,B类型是一个很好的解决方案。
template<typename A, typename B>
static bool TEST_EQ(A&& a, B&& b)
{
return (forward<A>(a) == forward<B>(b));
}
我正在测试完美转发,我不明白为什么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);
}
好吧,我发现我不能通过一个模板参数传递两种不同的值类型。所以这次编译,也许加一个static_assert来检查A,B类型是一个很好的解决方案。
template<typename A, typename B>
static bool TEST_EQ(A&& a, B&& b)
{
return (forward<A>(a) == forward<B>(b));
}