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
?
vostre forze alias copie per rvalues, invece di mosse. – Xeo
hai provato a usare 'auto' o' decltype (auto) 'nelle ultime due implementazioni funzionanti mantenendo' std :: remove_reference_t' negli argomenti? – iFreilicht