2013-03-22 12 views
12

Я попытался это:Можно ли инициализировать статическую переменную с помощью лямбда?

#include <map> 

int main() { 

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

} 

ошибка:

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

И да, я знаю, что я могу создать еще один «нормальный» функцию для того, муравей он работает, но лямбды не может инициализировать объекты, которые путь.

ответ

31

Да, это действительно возможно.

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

Обратите внимание на () в конце. Вы назначаете myMap лямбда, но вы действительно хотите назначить его на результат лямбда. Вы должны это назвать.

+0

Я думаю, вы пропустили '-> std :: map ' в объявлении лямбда. – theV0ID

+3

@ theV0ID, тип возврата не требуется на лямбда, если его можно вывести из оператора return (как это может быть здесь). (Замечание: если список параметров пуст, как и здесь, он также является необязательным. Таким образом, это можно было бы написать, используя: 'static auto myMap = [] {return std :: map ();}(); ') –

Смежные вопросы