Ist dieses Codebeispiel gültig?Ist die zurückgegebene einheitliche initialisierte Referenz gültig?
using ref = char&;
ref foo(ref x) {
return ref{x};
}
int main() {
char a;
foo(a);
return 0;
}
scheint, dass:
- Klirren 3.5 sagt JA
gcc 4.9 sagt NEIN
main.cpp: In function 'char& foo(ref)': main.cpp:4:15: error: invalid cast of an rvalue expression of type 'char' to type 'ref {aka char&}' return ref{x}; ^
http://coliru.stacked-crooked.com/a/cb6604b81083393f
Also welcher Compiler ist richtig? oder ist es nicht spezifiziert?
Es ist sehr einfach so von gcc Build-Fehler überwinden:
Klammern anstelle von Klammern
ref foo(ref x) { return ref(x); }
durch die Benennung zurückgegebene Wert
ref foo(ref x) { ref ret{x}; return ret; }
Option 1. unterbricht die einheitliche Initialisierung, Option 2 fügt eine nutzlose Codezeile hinzu.
ähnliche Frage wurde bereits hier aked: Why can't I initialize a reference in an initializer list with uniform initialization?
Aber erwähnt pr50025 4.9 in gcc fixiert ist.
Ich weiß, dass oben Codebeispiel ist ziemlich nutzlos, , aber ich übermäßig vereinfacht es absichtlich auf das Problem hinweisen. Im wirklichen Leben Code Problem kann in einer generischen Funktion wie ausgeblendet werden:
#include <utility>
template <typename Tp, typename... Us>
Tp bar(Us&&... us) {
return Tp{std::forward<Us>(us)...};
}
Weglassen 'Tp' in return-Anweisung verwirft' Tp's mit 'explicit' Bauer ... generische Funktion ist nicht mehr so generisch –
@KarolWozniak Das ist ein guter Punkt. Auf der anderen Seite benötigt das, was Sie bereits haben (alle drei Versionen), einen barrierefreien Copy- oder Move-Konstruktor, also ist es nicht so generisch, wie es möglicherweise sein könnte. Ich habe keine gute Alternative, die alle möglichen Typen umfasst, sorry. – hvd