相关疑难解决方法(0)

通过C++ 11 lambda中的引用捕获静态变量

主要问题

我正在尝试使用GCC 4.7.2编译以下代码:

#include <iostream>

int foo() {
    static int bar;
    return [&bar] () { return bar++; } (); // lambda capturing by reference
}

int main (int argc, char* argv[]) {
    std::cout << foo() << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

似乎进展不顺利,因为输出是这样的:

$p2.cpp: In function ‘int foo()’:
$p2.cpp:6:14: warning: capture of variable ‘bar’ with non-automatic storage duration [enabled by default]
$p2.cpp:4:16: note: ‘int bar’ declared here
Run Code Online (Sandbox Code Playgroud)

所以,我的第一个问题是:

这是GCC的失败,还是代码不合法​​C++ 11?这在GCC的最新版本中是否已修复?

在shared_ptr工厂中使用技巧

我考虑使用非文字静态变量构建基于此原理的工件.此工件旨在成为shared_ptr <T>对象的工厂,当您只需要为同一实例使用重复的shared_ptr容器时,它可以避免创建新的T对象.

这个工件看起来像:

std::shared_ptr<Foo> create(std::string name) {
    static std::unordered_map<std::string,std::weak_ptr<Foo>> registry;

    if …
Run Code Online (Sandbox Code Playgroud)

c++ lambda c++11

37
推荐指数
2
解决办法
2万
查看次数

为什么lambda只捕获自动存储变量?

我刚开始用C++学习lambda函数,我不明白为什么lambda只允许捕获自动存储变量?例如:

int x;
int main() {
    [&x](int n){x = n;}; // 'x' cannot be captured...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

另一方面,静态变量根本不需要捕获

static int s = 0;
[](int n){s = n;};
Run Code Online (Sandbox Code Playgroud)

那么,为什么不允许第一个例子而第二个例子呢?

c++ lambda c++11

14
推荐指数
2
解决办法
8191
查看次数

GCC错误地通过lambda函数中的引用捕获全局变量?

GCC似乎错误地通过lambda函数中的引用捕获全局变量,即使它们被指定为"按值捕获".此代码将编译并打印"a = 9":

#include <iostream>

int a = 10;

int main()
{
    [=]() { a = 9; } ();
    std::cout << "a = " << a << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

虽然这段代码不会编译:

#include <iostream>

int main()
{
    int a = 10;
    [=]() { a = 9; } (); // error: assignment of member 'main()::<lambda()>::a' in read-only object
    std::cout << "a = " << a << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但显式捕获全局值然后分配给它会产生错误:

#include <iostream>

int a = 10;

int main()
{
    [a]() …
Run Code Online (Sandbox Code Playgroud)

c++ lambda gcc c++11

13
推荐指数
1
解决办法
3267
查看次数

标签 统计

c++ ×3

c++11 ×3

lambda ×3

gcc ×1