主要问题
我试图用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>对象,避免新的T对象的创建时,你只需要为同一个实例重复的shared_ptr容器的工厂。
这神器将如下所示:
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>对象未设置为这可能静态变量后遭到破坏任何全局对象。
我说的对这个吗?