2014-09-18 8 views
5

Ho creato un alias std::forward che dovrebbe comportarsi esattamente come std::forward.Creazione di un alias `std :: forward` - risultati imprevisti

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

ho poi sostituito tutte le occorrenze di std::forward<...> con fwd<...> nella mia base di codice.

Compilati tutti i progetti con g++ 4.9 - tutti i test sono passati, tutto ha funzionato correttamente.

Quindi ho provato a compilare con clang++ 3.5. Alcuni test sembravano casualmente fallire, e il motivo era fwd<...>. Sostituendolo con std::forward<...> ancora riparato i test guasti.

ho provato a scrivere fwd<...> con il tipo di sintassi ritorno finale, come ho pensato decltype(auto) non funzionava:

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

Stessi risultati: g++ opere, clang++ non lo fa.

Ho poi guardato la firma del std::forward su cppreference, e attuate mio alias come questo:

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); } 

Questo funziona (tutti i test passano) sia su g++ e clang++.

Perché la versione decltype(auto) non funziona? Non dovrebbe restituire esattamente lo stesso tipo di ritorno di std::forward?

+3

vostre forze alias copie per rvalues, invece di mosse. – Xeo

+2

hai provato a usare 'auto' o' decltype (auto) 'nelle ultime due implementazioni funzionanti mantenendo' std :: remove_reference_t' negli argomenti? – iFreilicht

risposta

2

si è dimenticato di dichiarare Lvalore come riferimento mossa

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

non sono sicuro che 'fwd (T && mValue)' funzionerà se 'T' è' Tipo & 'o' Tipo && ' – programmerjake

+1

Si noti che la versione con riferimento al valore l è necessaria anche se si ottiene un errore di compilazione: (http://coliru.stacked-crooked.com/a/3505f7b8b37980e2) – Jarod42

+0

@ Jarod42 l'ha risolto, grazie – programmerjake

Problemi correlati