2014-09-18 15 views
5

Ich erstellte einen std::forward Alias, der genau wie std::forward verhalten sollte.Erstellen eines `std :: forward'-Alias ​​- unerwartete Ergebnisse

template<class T> 
constexpr decltype(auto) fwd(T mValue) noexcept 
{ 
    return std::forward<T>(mValue); 
} 

I ersetzt dann alle Vorkommen von std::forward<...> mit fwd<...> in meiner Code-Basis.

Kompiliert alle Projekte mit g++ 4.9 - alle Tests bestanden, alles hat funktioniert.

Dann habe ich versucht, mit clang++ 3.5 kompilieren. Einige Tests schienen zufällig zu versagen, und der Grund war fwd<...>. Ersetzen Sie es mit std::forward<...> erneut die fehlerhaften Tests behoben.

versuchte ich fwd<...> mit der hinteren Rückgabetyp Syntax zu schreiben, wie ich dachte decltype(auto) nicht funktioniert:

template<class T> 
constexpr auto fwd(T mValue) noexcept -> decltype(std::forward<T>(mValue)) 
{ 
    return std::forward<T>(mValue); 
} 

Gleiche Ergebnisse: g++ Werke, tut clang++ nicht.

Ich sah dann die Unterschrift von std::forward auf cppreference und implementiert mein alias wie folgt aus:

template<class T> 
constexpr T&& fwd(std::remove_reference_t<T>& t) { return std::forward<T>(t); } 

template<class T> 
constexpr T&& fwd(std::remove_reference_t<T>&& t) { return std::forward<T>(t); } 

Dies funktioniert (alle Tests bestanden) sowohl auf g++ und clang++.

Warum funktioniert die decltype(auto) Version nicht? Sollte es nicht genau den gleichen Rückgabetyp wie std::forward zurückgeben?

+3

Ihre alias Kräfte Kopien für rvalues, statt bewegt zu erklären. – Xeo

+2

Haben Sie versucht, in den letzten beiden Arbeitsimplementierungen 'auto' oder' decltype (auto) 'zu verwenden, während' std :: remove_reference_t' in den Argumenten beibehalten wird? – iFreilicht

Antwort

2

Sie haben vergessen mvalue als Schritt Referenz

template <typename T> 
constexpr decltype(auto) fwd(std::remove_reference_t<T> &&mValue) 
{ 
    return std::forward<T>(mValue); 
} 
template <typename T> 
constexpr decltype(auto) fwd(std::remove_reference_t<T> &mValue) 
{ 
    return std::forward<T>(mValue); 
} 
+1

ich bin nicht sicher, ob 'fwd (T && mValue)' funktioniert, wenn 'T'' Type & 'oder' Type && ' – programmerjake

+1

ist Beachten Sie, dass die Version mit l-Wert Referenz auch benötigt wird, sonst haben Sie einen Kompilierungsfehler: (http://coliru.stacked-crooked.com/a/3505f7b8b37980e2) – Jarod42

+0

@ Jarod42 behoben, danke – programmerjake

Verwandte Themen