char (&f(...))[2];
Dies ist die Deklaration einer Funktion, die einen Verweis auf ein Array von zwei Zeichen zurückgibt. Die Klammern müssen syntaktisch korrekt sein. Andernfalls wird die &
an char
binden und es wird einen Syntaxfehler geben, weil [2]
bedeutungslos ist.
Die Syntax kann mit einem Typalias zerlegt werden. Zum Beispiel:
using array_ref = char (&)[2];
array_ref f(...);
Der Grund für einen Verweis auf ein Feld zurückkehrt, anstatt eine tatsächliche Anordnung ist aufgrund der Tatsache, dass nicht-Arrays von Funktionen zurückgebracht werden kann. Es ist unmöglich. Sie können nur Referenzen oder Zeiger auf Arrays zurückgeben, genau wie Funktionen. In allen Beispielen ist ...
ein C variadic argument pack.
Die einzigen Orte, an denen ich diese Art von Syntax gesehen habe ist, wo ist es für SFINAE als Teil der Funktion der Überladungsauflösung verwendet wird. In der Regel wird diese Funktion von einer gleichnamigen Überladung begleitet, bei der die Vorlagenersetzung zum Überprüfen eines Attributs eines bestimmten Typs verwendet wird.Wenn ein Substitutionsfehler auftritt, wird die zweite Überladung (diejenige, die ein variadisches Paket annimmt) als Fallback gewählt. Sein Rückgabetyp unterscheidet Erfolg oder Misserfolg.
Zum Beispiel, hier ist Charakterzug Klasse, die, wenn ein Typ überprüft hat eine Memberfunktion f()
:
template <typename T>
struct has_f
{
private:
using true_type = char (&)[1];
using false_type = char (&)[2];
template <typename U>
static decltype(std::declval<U>().f(), true_type()) f(int);
template <typename>
static false_type f(...);
public:
static constexpr bool value = sizeof(check<T>(0)) == 1;
};
Wie Sie sehen können, wenn T
eine Memberfunktion f()
hat, dann ist die Größe des Typs zurückgegeben werden 1
, sonst 2
. true_type
und false_type
werden heutzutage weitgehend durch die Standard-Merkmalsklassen std::true_type
und std::false_type
ersetzt, aber dies ist nur ein Beispiel, um seine Verwendung zu veranschaulichen.
Bitte geben Sie den vollständigen Kontext ein, in dem dieser Code angezeigt wird. –
ist es nicht Referenz auf Array von 2 Funktionen, die char zurückgeben und C-Stil Elipse nehmen? – Creris
Es ist eine Funktion, die einen Verweis auf ein Array von zwei Zeichen zurückgibt. Der zweite ('char (& f (...))') ist eine Funktion, die einen Verweis auf ein Zeichen zurückgibt. Die äußere Klammer ist im zweiten Fall überflüssig und in beiden Fällen ist "..." ein C variadic Argument-Pack. – 0x499602D2