C ++ 0x лямбда-возвращаемое значение правила вывода типа - PullRequest
2 голосов
/ 04 ноября 2010

Рассмотрим две лямбда-функции в следующем коде VC ++ 10.0:

template <typename T>
void eq(uint fieldno, T value) {
    table* index_table = db.get_index_table(fieldno);
    if (index_table == nullptr) return;
    std::set<uint> recs;
    index_table->scan_index<T>(value, [&](uint recno, T n)->bool {
        if (n != value) return false;
        recs.insert(recno);
        return true;
    });
    add_scalar_hits(fieldno, recs).is_hit =
        [=](tools::wsdb::field_instance_t& inst) {
            return boost::get<T>(inst) == value;
        };
}

В первой лямбда-функции я был вынужден использовать спецификацию ->bool возвращаемого типа, тогда как во второй лямбда-компилятор был совершенно счастлив вывести тип возвращаемого значения.

Мой вопрос: когда компилятор может определить тип возврата лямбды? Разве только если у вас есть простой однострочник?

1 Ответ

5 голосов
/ 04 ноября 2010

«Разве только когда у вас простая однострочная?»

Да.Согласно последнему общедоступному проекту C ++ 0x (§5.1.2 / 4),

Если лямбда-выражение не включает трейлинг-возврат-тип , как если бы тип конечного возврата обозначает следующий тип:

  • , если составной оператор равенвида

    { return атрибут-спецификатор opt выражение ; }

    тип возвращаемого выраженияпосле преобразования lvalue в rvalue (4.1), преобразования массива в указатель (4.2) и преобразования функции в указатель (4.3);

  • в противном случае, void.

[ Пример:

 auto x1 = [](int i){ return i; }; // OK: return type is int
 auto x2 = []{ return { 1, 2 }; }; // error: the return type is void (a
                                   // braced-init-list is not an expression)

- конец примера ]

Следовательно, ваше первое лямбда-выражение интерпретируется как возвращающее void, что неверно, поэтому вам нужно добавить -> bool, чтобы явно указать тип возвращаемого значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...