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.

È stato utile?

Soluzione

Questo è noto come "parse più fastidioso C ++ s '". Vedere qui e qui .

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top