Я пытаюсь использовать auto в качестве типа возврата для возвращаемой лямбда-функции. Вот минимальный пример, который демонстрирует проблему, с которой я столкнулся:
#include <iostream>
#include <memory>
auto
get_func()
{
auto i = std::make_unique<int>(2);
if (*i == 1) {
return [i=std::move(i)]() {
return *i;
};
}
return [](){ return 2; };
}
int
main(int argc, char* argv[])
{
auto func = get_func();
std::cout << "val: " << func() << std::endl;
return 0;
}
На моем Mac я получаю следующую ошибку компиляции:
$ g++ -g -Wall -Werror -std=c++17 test.cc -o test
test.cc:13:5: error: 'auto' in return type deduced as '(lambda at test.cc:13:12)' here but deduced as '(lambda at test.cc:9:16)' in earlier return statement
return [](){ return 2; };
^
1 error generated.
Правильно, они обавыводится как lambda
. И у них обоих одинаковая подпись void(void)
. Я вижу проблемы, потому что они указывают разные захваты? Если это так, каковы мои варианты получения вызова той же функции для вызывающей стороны (как видно из вызова cout
в main
).