ho una tale classe di utilità:inizializzazione e lambda-tipo di argomento
struct Atreturn
{
std::function<void()> funcdestr;
Atreturn(std::function<void()> fd): funcdestr(fd) {}
~Atreturn() { funcdestr(); }
};
Nota n explicit
attributo alla costruttore.
Possibile uso dovrebbe essere:
diretto inizializzazione costruttore di chiamata:
Atreturn hook ([something]() { DestroySomething(something); });
Copy-inizializzazione costruttore di chiamata:
Atreturn hook = [something]() { DestroySomething(something); };
diretto-list-inizializzazione chiamata al costruttore:
Atreturn hook { [something]() { DestroySomething(something); }};
Ora la domanda: al mio migliore conoscenza, il metodo # 1 e # 2 dovrebbe essere consentito in quanto sono in teoria la stessa cosa, a condizione che non c'è il explicit
presso il costruttore, mentre # 3 non dovrebbe essere permesso perché questa sintassi impedisce le conversioni (almeno lo è per lo int
se si è provato a int{2.1}
).
Tuttavia, gcc 4.9 consente il metodo n. 1 e n. 3, ma non n. 2 (e dice conversion from '...::<lambda()>' to non-scalar 'Atreturn' type requested
). Sembra pazzesco perché normalmente accade solo se hai il costruttore explicit
. Qualcuno può spiegare, perché?
Inoltre, permettimi di rendere questo problema più esplicito: ho bisogno di una sintassi non troppo maldestra per inizializzare questo oggetto Atreturn, almeno senza bisogno di parentesi o parentesi extra. Il problema è che gli editor con la funzione auto-indent hanno problemi con la corretta reindentazione quando l'argomento è C++ 11 lambda. Quindi ho bisogno di un po 'di sintassi che potrebbe essere espresso come:
Atreturn BLAH BLAH BLAH [something]() { DestroySomething(something); };
(Aggiungere anche la costruzione di inizializzazione della copia-lista: 'Areturn hook = {...}'?) –
È lo stesso metodo # 3, this = è facoltativo in C++ 11. – Ethouris
# 1 e # 2 sono * non * uguali. Lo sarebbero se il tipo a destra fosse 'Atreturn', ma non lo è. – Angew