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?
Ihre alias Kräfte Kopien für rvalues, statt bewegt zu erklären. – Xeo
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