C++0x lambda 返回值类型推断规则

发布于 2024-10-01 03:28:55 字数 745 浏览 2 评论 0原文

考虑以下 VC++ 10.0 代码中的两个 lambda 函数:

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;
        };
}

在第一个 lambda 函数中,我被迫使用 ->bool 返回类型规范,而在第二个 lambda 中,编译器非常乐意推断返回类型。

我的问题是:编译器什么时候可以推断 lambda 的返回类型?只有当你只有一句简单的台词时才这样吗?

Consider the two lambda functions in the following VC++ 10.0 code:

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;
        };
}

In the first lambda function, I was forced to use the ->bool return type specification whereas in the second lambda the compiler was perfectly happy to infer the return type.

My question is: when can the compiler infer the return type on a lambda? Is it only when you have a simple one-liner?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

自演自醉 2024-10-08 03:28:55

“只有当你有一句简单的俏皮话时才这样吗?”

是的。根据最新的公开 C++0x 草案 (§5.1.2/4),

如果lambda 表达式不包含尾随返回类型,则就好像尾随返回类型表示以下类型:

  • 如果复合语句的形式为

    { return 属性说明符opt 表达式 ; }

    左值到右值转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)后返回表达式的类型;

  • 否则,无效

[示例:

 auto x1 = [](int i){ return i; }; // OK: 返回类型为 int
 自动 x2 = []{ 返回 { 1, 2 }; }; // 错误:返回类型为 void (a
                                   // braced-init-list 不是表达式)

结束示例]

因此,您的第一个 lambda 表达式被解释为返回 < code>void,这是不对的,所以需要添加一个->; bool 显式指定返回类型。

"Is it only when you have a simple one-liner?"

Yes. According to the latest public C++0x draft (§5.1.2/4),

If a lambda-expression does not include a trailing-return-type, it is as if the trailing-return-type denotes the following type:

  • if the compound-statement is of the form

    { return attribute-specifieropt expression ; }

    the type of the returned expression after lvalue-to-rvalue conversion (4.1), array-to-pointer conver- sion (4.2), and function-to-pointer conversion (4.3);

  • otherwise, void.

[ Example:

 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)

end example ]

Therefore, your first lambda expression is interpreted as returning void, which is not right, so you need to add a -> bool to explicitly specify the return type.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文