我试图消除超载设置,如果operator+=
丢失超载。SFINAE检查运营商+ =
我知道如何检查是否T+T
是合法的:
template<typename T,
typename CheckTplusT = decltype(std::declval<T>() + std::declval<T>())>
void foo(T a, T b, ...)
{
a = a + b;
}
但这并不为+=
template<typename T,
typename CheckTplusT = decltype(std::declval<T>() += std::declval<T>())>
void foo(T a, T b, ...)
{
a += b;
}
工作,这是可以解决的,通过使用内部decltype
另一种表达还是需要另一SFINAE构造?
我需要从重载集中消除这个问题的原因是它与另一个接受函数的超载冲突,以作为+=
的替代方案。编译器是VS2013,gcc4.8
你调用'foo'的什么形式不起作用? – 2014-10-01 10:22:28
@PiotrS。 :第二种形式不起作用。你不能在右值'std :: declval()'上调用+ =(非const方法)。但是你可以在rvalues上调用+。比较2 + 2和2 + = 2 –
MSalters
2014-10-01 10:38:46
@MSalters如果'+ ='是一种方法,则可以在rvalues上调用它(除非方法有'&'限定符)。问题出在内置的'+ ='和基本类型。 – dyp 2014-10-01 10:52:55