警告绑定到临时值的 clang 是否正确

Is clang correct to warn of a binding to a temporary value?

本文关键字:clang 是否 绑定 警告      更新时间:2023-10-16

在此代码中,clang 警告v将被绑定到一个临时值。我希望它绑定到函数外部定义的变量之一。叮当对吗?

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

在科里鲁上看到它

只是做

static auto const& v = []() -> auto& { /* logic to return a or b or c */ }();

相反,你很好。