2014-12-07 57 views
2

std::result_of頁面上有一個可能的實現部分。它有這段代碼:cppreference示例中不必要的std :: forward使用

template <class Base, class T, class Derived> 
inline auto INVOKE(T Base::*&& pmd, Derived&& ref) -> 
    decltype(forward<Derived>(ref).*forward<T Base::*>(pmd)) { 
     return forward<Derived>(ref).*forward<T Base::*>(pmd); 
} 

我認爲不必要的部分是使用std::forward<T Base::*>T Base::*&& pmd的簽名不使用像「Derived&& ref」那樣的「通用參考」。因此它總是一個指向成員的右值引用。

我的理解是否正確? forward<T Base::*>可以取出嗎?

+0

是的,轉發成員指針是不必要的。 (順便說一句:這是一個恥辱'INVOKE'不是標準庫的一部分) – Deduplicator 2014-12-07 22:25:19

+0

@Deduplicator我和作者[N4169](http://www.open-std.org/jtc1/sc22/wg21/docs/論文/ 2014/n4169.html)同意'invoke'應該在標準庫中。 – Casey 2014-12-08 18:31:22

回答

2

所述第二操作數的值的類別(即,指針到構件)不是一個指針到構件操作者顯著。 因此forward的確是多餘的,過載可以改寫爲

template <class Base, class T, class Derived> 
inline auto INVOKE(T Base::*&& pmd, Derived&& ref) -> 
    decltype(forward<Derived>(ref).*pmd) { 
     return forward<Derived>(ref).*pmd; 
} 

的作者可能複製粘貼&模板「模板」,並沒有理會去除不必要的轉發。

0

The edit from 2014-07-27 changed the pointer-to-member argument of that particular INVOKE overload from PMD&& pmd to T Base::*&& pmd帶註釋「修正了一個錯誤,當ObjectRef有一個重載的間接運算符返回自己。」由於.*不可重載,我不確定評論所指的是什麼錯誤,但確實是introduce a new bug by requiring the pointer-to-member to be an rvalue

我通過更改兩個受影響的重載以按值指向成員來修復了該錯誤;我很猶豫是否完全退出了這一改變。任何人都可以證明編輯提到的問題嗎?

+0

我相信這會令比答案更美好的新問題。 :)我也看不到錯誤,FWIW。 – hvd 2014-12-08 19:10:51

相關問題