このコードでは、clangはv
が一時的な値にバインドされることを警告します。関数の外で定義された変数にバインドされることが期待されます。 clangは正しいですか?一時的な値へのバインディングを警告するのにclangが正しいですか?
std::vector<int> a, b, c;
void foo()
{
static auto const& v = [](){ /* logic to return a or b or c */ }();
}
このコードでは、clangはv
が一時的な値にバインドされることを警告します。関数の外で定義された変数にバインドされることが期待されます。 clangは正しいですか?一時的な値へのバインディングを警告するのにclangが正しいですか?
std::vector<int> a, b, c;
void foo()
{
static auto const& v = [](){ /* logic to return a or b or c */ }();
}
はい、一時参照をそこにバインドしています。ラムダはあなたが選択したベクトルのコピーを返します。
あなたがfooへの最初の呼び出しの後にバインドベクトルを変更しようとする場合は、このような場合は見ることができます:
void foo()
{
static auto const& v = [](){ return a; }();
std::cout << v.size() << '\n';
}
...
foo();
a.push_back(1);
foo();
a.push_back(2);
が
1
1
が coliru 上でそれを見る印刷します
ちょうだい
static auto const& v = []() -> auto& { /* logic to return a or b or c */ }();
代わりにあなたは良いです。
static auto const&v = []() - >自動&{/ * aまたはbまたはcを返すロジック* /}();動作しないでしょう。 rtを返す必要があります。 – Naidu
rt?私は自分自身がその用語になじみがなく、あなたが意味することを文脈から推論することができないと感じます。 – jaggedSpire
( "rt"の意味を詳しく教えてください。正確にはこれはうまくいかないのですが、RTはこれまで見たことのない頭字語です - "参照型"や* l-value *を意味しますか? * r値*?) – jaggedSpire
'[]() - > std :: vector&{...'、あなたが参照ではなくコピーを返すことを前提としています。 'auto 'も使えます。 –
jaggedSpire
@ jaggedSpire Aaah!私の良さ、そうです! – screwnut
@jaggedSpireでも、一時的な有効期間は 'v'にバインドすることで拡張する必要がありますので問題ありませんか?私はダングリングリファレンスが作成された場合、そのような警告を期待していたでしょう –