[英]rvalue reference template argument deduction on operators
關於is_densevector
類的operator-
實現,我想要:
g = -v;
調用運算符的第一個版本(v的克隆將為負),並:
g = -std::move(v);
g = -(v + v);
g = -std::vector<double>({1,2,3});
調用運算符的第二個版本(矢量本身將為負值-以提高性能)。
訣竅是!std::is_reference<C>::value
但是我不確定這是否正確。 看來它正在工作。
//! Return the negative of vector \p v.
template<typename C>
typename std::enable_if<is_densevector<C>::value, C>::type
operator-(const C &v) { return ....; }
//! Return the negative of vector \p v.
template<typename C>
typename std::enable_if<!std::is_reference<C>::value && is_densevector<C>::value, C>::type
&&operator-(C &&v) { ....; return std::move(v); }
你所做的是正確的。 由於您忘了問一個真正的問題,我想您想檢查一下為什么它起作用/有必要嗎? 這是必要的,因為在第二種情況下,扣除將產生const T&
或C&&
T&
。 通過引用折疊,右值引用被刪除。 由於這與第一個重載現在是模棱兩可的,因此您需要使用is_reference
的檢查來消除歧義。
請注意,僅對於完全推導的參數才需要這樣做。 另一個選擇是以下方法,它依賴於簡單的重載解析以及僅推導向量的值類型而不是整個向量類型的事實:
//! Return the negative of vector \p v.
template<typename C>
typename std::enable_if<
is_densevector<std::vector<C>>::value,
std::vector<C>
>::type
operator-(const std::vector<C> &v) { return ....; }
//! Return the negative of vector \p v.
template<typename C>
typename std::enable_if<
is_densevector<std::vector<C>>::value,
std::vector<C>&&
>::type
operator-(std::vector<C> &&v) { ....; return std::move(v); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.