mam takiej klasy użytkowy:inicjalizacji i lambda typu argumentu
struct Atreturn
{
std::function<void()> funcdestr;
Atreturn(std::function<void()> fd): funcdestr(fd) {}
~Atreturn() { funcdestr(); }
};
Uwaga nie explicit
atrybutu z konstruktora.
Możliwe stosowanie powinno być:
Direct-inicjowania wywołania konstruktora:
Atreturn hook ([something]() { DestroySomething(something); });
kopiowaniem inicjowania wywołania konstruktora:
Atreturn hook = [something]() { DestroySomething(something); };
Direct-lista-inicjowania wywołania konstruktora:
Atreturn hook { [something]() { DestroySomething(something); }};
Teraz pytanie: do mojej najlepszej wiedzy, metoda # 1 i # 2 powinny być dozwolone, ponieważ są one teoretycznie to samo, pod warunkiem, że nie ma explicit
w konstruktorze, natomiast # 3 nie powinno być dozwolone, ponieważ ta składnia uniemożliwia konwersje (przynajmniej tak jest w przypadku int
, jeśli próbowałeś int{2.1}
).
Jednak gcc 4.9 pozwala na metody nr 1 i nr 3, ale nie na nr 2 (i mówi conversion from '...::<lambda()>' to non-scalar 'Atreturn' type requested
). Brzmi to szalenie, ponieważ zwykle dzieje się tak tylko wtedy, gdy masz konstruktora explicit
. Czy ktoś może wyjaśnić, dlaczego?
Dodatkowo, pozwolę sobie bardziej wyjaśnić ten problem: potrzebuję niezbyt skomplikowanej składni, aby zainicjować ten obiekt Atreturn, przynajmniej bez potrzeby stosowania dodatkowych nawiasów klamrowych lub nawiasów. Problem polega na tym, że edytory z funkcją auto-wcięcia mają problemy z prawidłowym powtórzeniem, gdy argumentem jest C++ 11 lambda. Więc muszę trochę składni, która może być wyrażona jako:
Atreturn BLAH BLAH BLAH [something]() { DestroySomething(something); };
(Dodaj również konstrukcję inicjującą listę kopiowania: 'Areturn hook = {...}'?) –
To jest to samo co metoda # 3, to = jest opcjonalne w C++ 11. – Ethouris
# 1 i # 2 to * nie * to samo. Byłoby, gdyby typ z prawej był "Atreturn", ale tak nie jest. – Angew