Я смотрел на std:: unordered_map и увидел, что если бы я хотел использовать строку в качестве ключа, мне пришлось бы создать класс, содержащий функтор.
Из любопытства мне было интересно, можно ли использовать лямбда вместо этого.
Здесь рабочий оригинал:
struct hf
{
size_t operator()(string const& key) const
{
return key[0]; // some bogus simplistic hash. :)
}
}
std::unordered_map<string const, int, hf> m = {{ "a", 1 }};
Здесь моя попытка:
std::unordered_map<string const, int, [](string const& key) ->size_t {return key[0];}> m = {{ "a", 1 }};
Не удалось выполнить следующие ошибки:
exec.cpp: In lambda function:
exec.cpp:44:77: error: ‘key’ cannot appear in a constant-expression
exec.cpp:44:82: error: an array reference cannot appear in a constant-expression
exec.cpp: At global scope:
exec.cpp:44:86: error: template argument 3 is invalid
exec.cpp:44:90: error: invalid type in declaration before ‘=’ token
exec.cpp:44:102: error: braces around scalar initializer for type ‘int’
Учитывая ошибки, казалось бы, что ламба отличается от функтора настолько, что делает это не постоянным выражением. Это правильно?