在此代码中,clang警告v
将被绑定到一个临时值。我期望它被绑定到函数之外定义的变量之一。铿锵声是否正确?Clang是否正确警告绑定到临时值?
std::vector<int> a, b, c;
void foo()
{
static auto const& v = [](){ /* logic to return a or b or c */ }();
}
在此代码中,clang警告v
将被绑定到一个临时值。我期望它被绑定到函数之外定义的变量之一。铿锵声是否正确?Clang是否正确警告绑定到临时值?
std::vector<int> a, b, c;
void foo()
{
static auto const& v = [](){ /* logic to return a or b or c */ }();
}
是的,你绑定一个临时参考。 lambda返回所选矢量的副本,而不是对它的引用。
你可以看到这样的话,如果你试图改变第一次调用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 = []() - > auto&{/ *逻辑返回a或b或c * /}();不管用。你需要返回rt。 – Naidu
rt?我发现自己对这个词不熟悉,无法从上下文中推断出你的意思。 – jaggedSpire
(请详细说明“rt”是什么意思,以及它究竟是如何工作的,RT是我以前从未见过的缩写词 - 是指“参考类型”还是* l-value *?an * r值*?) – jaggedSpire
'[]() - > std :: vector&{...',它假定您想要返回一个不是引用的副本。你也可以使用'auto&'。 –
jaggedSpire
@jaggedSpire Aaah!我的天啊,没错! – screwnut
@jaggedSpire即使这样,临时生命期应该通过绑定到'v'来扩展,所以没有问题?我会在创建悬挂参考的情况下预期这样的警告 –