主な質問
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 への準拠に関して問題にならない場合、このアーティファクトも問題にならないはずです。このハックを使用する際に注意すべき唯一のことは、結果の shared_ptr< T > オブジェクトを、静的変数の後に破棄される可能性のあるグローバル オブジェクトに設定しないことです。
私はこれについて正しいですか?