未记录的GCC C11扩展名捕获lambda捕获列表中的任意表达式

奇怪的是,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

甚至在n3285(日期:2012-10-02),我似乎都没有提到在lambda捕获列表中捕获任意表达式.此外,我似乎没有找到任何文档作为官方GCC扩展.

这是一个无证件的海湾合作委员会的延伸(一个07-07,GCC已经提前/即将推出的C功能,提前实施,既没有,两者也不是什么?

最佳答案
如评论所述,该功能与最近的提案大致相似,但在初始标准化之前已被实施. GCC在标准开发期间担任原型,最初反映了作者喜欢的任何想法,后来被改进.一些必须修剪以保持标准相当简单的想法被重新引用为提案.兰布斯有很大的发展空间.

现在,这只是另一个错误.它从来没有从原来的实现中删除,因为没有人报告它.

更新:自C 14以来,这是一个标准功能.

转载注明原文:未记录的GCC C11扩展名捕获lambda捕获列表中的任意表达式 - 代码日志