【问题标题】:Undocumented GCC C++11 extension? Capturing arbitrary expressions in lambda capture lists未记录的 GCC C++11 扩展?在 lambda 捕获列表中捕获任意表达式
【发布时间】:2013-03-23 06:04:16
【问题描述】:

奇怪的是,GCC 4.7.2 对以下代码似乎没有问题:

template<typename T>
T&& identity(T&& x1) {
    return std::forward<T>(x1);
}

int main(int, char**) {
    int x1 = 1;
    int &x2 = identity(x1);
    auto f = [&x1]() mutable {
        x1 = x1 + 1;
    };
    auto g1 = [y=x2+1]() {
        static_assert(std::is_same<decltype(y), const int>::value, "fail");
        std::cout << "g1: " << y << std::endl;
    };
    auto h1 = [y=identity(x1)+1]() {
        static_assert(std::is_same<decltype(y), const int>::value, "fail");
        std::cout << "h1: " << y << std::endl;
    };
    auto g2 = [&y=x2]() {
        static_assert(std::is_same<decltype(y), int&>::value, "fail");
        std::cout << "g2: " << y << std::endl;
    };
    auto h2 = [&y=identity(x1)]() {
        static_assert(std::is_same<decltype(y), int&>::value, "fail");
        std::cout << "h2: " << y << std::endl;
    };
    f(); g1(); h1(); g2(); h2();
    f(); g1(); h1(); g2(); h2();
    return 0;
}

结果如下:

g1: 2
h1: 2
g2: 2
h2: 2
g1: 2
h1: 2
g2: 3
h2: 3

我似乎找不到任何关于在 lambda 捕获列表中捕获任意表达式的内容,即使在 n3285(日期为 2012-10-02)中也是如此。此外,我似乎无法在任何地方找到任何关于此作为官方 GCC 扩展的文档。

这是一个未记录的 GCC 扩展(例如 VLAs as structure members,一个提议/即将推出的 C++ 功能,GCC 已经提前实施并提前实施,两者都没有,还是什么?

【问题讨论】:

  • 有一个类似这样的proposal
  • @JohnSchug 哦,但那是 2013-03-15 的日期!所以答案是“两者”? (因为这似乎早于提案?)
  • (它似乎也没有提到GCC的实现,所以它可能完全独立于这个开发。)
  • 在过去 10 分钟搜索 gcc 源代码后,我在第 8239-8250 行找到了处理此问题的 portion。它似乎是由修订版 139245 引入到 2008 年创建的分支 cxx0x-lambdas-branch 的。
  • @JohnSchug 哇,谢谢...我想它一直在那里。如果您想在答案中写下您的发现,我会接受它,等待一些具有第一手知识的内部人士提出更详细的信息。

标签: c++ gcc c++11 lambda


【解决方案1】:

正如 cmets 中所述,该功能与最近的提案大体相似,但早在初始标准化之前就已实施。 GCC 在标准开发过程中作为原型,最初反映了作者喜欢的任何想法,后来被完善。为了使标准保持相当简单而必须进行调整的一些想法正在作为提案重新引入。 Lambda 有很大的发展空间。

目前,这只是另一个错误。它从未从原始实现中删除,因为尚未有人报告它。


更新:这是自 C++14 以来的标准功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 2021-01-30
    • 2015-11-23
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多