主要问题
我正在尝试使用 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;
}
似乎进展不顺利,因为输出是这样的:
$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
所以,我的第一个问题是:
这是 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 (auto it = registry.find(name) != registry.end())
return registry[name].lock();
auto b = std::shared_ptr<Foo>(
new Foo(name),
[®istry] (Foo* p) {
registry.erase(p->getName());
delete p;
});
registry.emplace(name,b);
return b;
}
据我所知,如果之前讨论的 GCC 问题在 C++11 一致性方面不是问题,那么这个工件也不应该是问题。使用此 hack 唯一需要注意的是,不要将生成的 shared_ptr< T > 对象设置为任何可能在静态变量之后被破坏的全局对象。
我是对的吗?