2017-04-11 23 views
2

在此代码中,clang警告v将被绑定到一个临时值。我期望它被绑定到函数之外定义的变量之一。铿锵声是否正确?Clang是否正确警告绑定到临时值?

std::vector<int> a, b, c; 

void foo() 
{ 
    static auto const& v = [](){ /* logic to return a or b or c */ }(); 
} 
+4

'[]() - > std :: vector &{...',它假定您想要返回一个不是引用的副本。你也可以使用'auto&'。 – jaggedSpire

+0

@jaggedSpire Aaah!我的天啊,没错! – screwnut

+0

@jaggedSpire即使这样,临时生命期应该通过绑定到'v'来扩展,所以没有问题?我会在创建悬挂参考的情况下预期这样的警告 –

回答

3

是的,你绑定一个临时参考。 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 */ }(); 

相反,你很好。

+0

static auto const&v = []() - > auto&{/ *逻辑返回a或b或c * /}();不管用。你需要返回rt。 – Naidu

+0

rt?我发现自己对这个词不熟悉,无法从上下文中推断出你的意思。 – jaggedSpire

+0

(请详细说明“rt”是什么意思,以及它究竟是如何工作的,RT是我以前从未见过的缩写词 - 是指“参考类型”还是* l-value *?an * r值*?) – jaggedSpire