我試圖消除超載設置,如果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