2013-03-22 10 views
12

Próbowałem to:czy można zainicjować zmienną statyczną za pomocą lambda?

#include <map> 

int main() { 

    static std::map<int,int> myMap = [](){ 
    std::map<int,int> myMap; 
    return myMap; 
    }; 

} 

błąd:

<stdin>: In function 'int main()': 
<stdin>:8:3: error: conversion from 'main()::<lambda()>' to non-scalar type 'std::map<int, int>' requested 

I tak, wiem, że mogę stworzyć kolejny „normalny” funkcji za to mrówka działa, ale lambda nie może zainicjować obiektów, które droga.

Odpowiedz

31

Tak, jest to rzeczywiście możliwe.

static std::map<int,int> myMap = [](){ 
    std::map<int,int> myMap; 
    return myMap; 
}(); 

Zauważ () na końcu. Przypisujesz myMap do lambda, ale naprawdę chcesz przypisać ją do wyniku lambda. Musisz to tak nazwać.

+0

Myślę, że brakowało ci '-> std :: map ' w deklaracji lambda. – theV0ID

+3

@ theV0ID, typ zwracany nie jest konieczny dla lambda, jeśli można go wywnioskować z instrukcji return (tak jak tutaj). (Nota boczna: Jeśli lista parametrów jest pusta, tak jak jest tutaj, jest również opcjonalna, więc można to zapisać za pomocą: 'static auto myMap = [] {return std :: map ();}(); ') –

Powiązane problemy