Ich frage mich, wie Anrufe für diese beiden Überlastungen von std::make_optional
aufgelöst werden:Funktion Vorlage Überlastungen Auflösung Verwirrung
template< class T >
constexpr std::optional<std::decay_t<T>> make_optional(T&& value);
template< class T, class... Args >
constexpr std::optional<T> make_optional(Args&&... args);
Ich weiß Aufruf ohne explizites Template-Argument wie make_optional(123)
die ersten nennen, aber wie wäre es make_optional<int>(123)
? Welche Überladung wird ausgewählt und nach welchen Regeln?
UPDATE: Und wenn ich make_optional<string>("hello world")
schreiben sagen, werde ich die zweite Überlastung Aufruf (auch wenn der String kann implizit in ein string
umgewandelt werden), richtig?
wo Bibliothek (und Namespace) deklarieren? ['std :: experimental'] (http://en.cppreference.com/w/cpp/header/experimental/optional) scheint nur den ersten zu definieren. – Nawaz
@Nawaz: Die zweite Überladung von 'make_optional' kommt von [P0032 (PDF)] (http://wg21.link/P0032), welches [LWG vor Oulu weitergeleitet wurde] (https://issues.isocpp.org) /show_bug.cgi?id=100), anscheinend. Obwohl P0091 es möglicherweise veraltet macht, haben sie es möglicherweise nicht übernommen. Zurzeit ist Nawaz richtig: Die zweite Überladung existiert nicht. –
@ NicolBolas [Es existiert] (https://github.com/cplusplus/draft/commit/1882aa320a101fcfdb7a6d4de40197982209ce30). –