13

奇怪的是,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 扩展(作为结构成员的 la VLA,一个提议/即将推出的 C++ 功能,GCC 已经提前并提前实现了,两者都不是,还是什么?

4

1 回答 1

5

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

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


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

于 2013-04-27T03:37:30.647 回答