costruzione di oggetti / funzione Forward dichiarazione ambiguità
-
21-09-2019 - |
Domanda
Observation: the codes pasted below were tested only with GCC 4.4.1, and I'm only interested in them working with GCC.
Ciao,
Non è stato solo per un paio di volte che mi sono imbattuto in una dichiarazione di costruzione oggetto che non ho capito, e solo oggi che ho notato ciò ambiguità veniva introdotto da esso. Mi spiego come riprodurre e vorrei sapere se c'è un modo per risolvere il problema (C ++ 0x consentito). Qui si va.
Supponiamo che ci sia una classe il cui costruttore prende un solo argomento, e il tipo di questo argomento è un'altra classe con un costruttore di default. Per esempio:.
struct ArgType {};
class Class
{
public:
Class(ArgType arg);
};
Se provo per costruire un oggetto di tipo Class
in pila, ottengo un'ambiguità:
Class c(ArgType()); // is this an object construction or a forward declaration
// of a function "c" returning `Class` and taking a pointer
// to a function returning `ArgType` and taking no arguments
// as argument? (oh yeh, loli haets awkward syntax in teh
// saucecode)
dico che è una costruzione oggetto, ma il compilatore insiste è una dichiarazione anticipata all'interno del corpo della funzione. Per voi che ancora non farlo, qui è un esempio completamente funzionante:
#include <iostream>
struct ArgType {};
struct Class {};
ArgType func()
{
std::cout << "func()\n";
return ArgType();
}
int main()
{
Class c(ArgType());
c(func); // prints "func()\n"
}
Class c(ArgType funcPtr()) // Class c(ArgType (*funcPtr)()) also works
{
funcPtr();
return Class();
}
Così bene, abbastanza esempi. Chiunque può aiutarlo ad ottenere intorno a questo senza fare nulla di troppo anti-idiomatica (Sono uno sviluppatore biblioteca e la gente come le biblioteche idiomatiche)?
- modifica
Non importa. Questa è una vittima di parse più fastidiosi: perché non fa A bis (() ); lavorare? .
Grazie, SBI.
Altri suggerimenti
Diamo semplificare un po '.
int f1();
Che cos'è? Il compilatore (e io) dicono che è una dichiarazione anticipata di una funzione che restituisce un numero intero.
Che ne dici di questo?
int f2(double );
Il compilatore (e io) dico che è una dichiarazione anticipata di una funzione di prendere un doppio argomento e restituisce un int.
Quindi hai provato questo:
ClassType c = ClassType(ArgType());
Controlla la c ++ faq lite su costruttori spiegazioni ed esempi
Sulla base del "C ++ 0x permesso", la risposta giusta è (probabilmente) per cambiare la definizione di:
Class c(ArgType {});
semplice, diretto e mette tutto l'onere per l'utente della biblioteca, non l'autore!
Edit: Sì, il ctor viene richiamato - C ++ 0x aggiunge List-inizializzazione come un modo inequivocabile per delimitare le liste di inizializzazione. Non può essere mis-analizzati come nel campione, ma per il resto il significato è più o meno lo stesso come se si è utilizzato parentesi. Vedere N3000 , il terzo proiettile punto sotto §8.5.4 / 3. È possibile scrivere un ctor per ricevere una lista di inizializzazione come un unico argomento, o gli elementi nella lista di inizializzazione può essere abbinato con gli argomenti ctor individualmente.