C++ 为什么铿锵++;用“报告结构化绑定”;存储到';的值';在初始化过程中,从不读取“;?

C++ 为什么铿锵++;用“报告结构化绑定”;存储到';的值';在初始化过程中,从不读取“;?,c++,clang++,c++17,structured-bindings,C++,Clang++,C++17,Structured Bindings,我有以下测试用例: testcase("[room] exits") { auto [center, east, north, south, west] = make_test_rooms(); check_eq(center->east(), east); check_eq(center->north(), north); check_eq(center->south(), south); check_eq(center->we

我有以下测试用例:

testcase("[room] exits") {
    auto [center, east, north, south, west] = make_test_rooms();

    check_eq(center->east(), east);
    check_eq(center->north(), north);
    check_eq(center->south(), south);
    check_eq(center->west(), west + 1);
}
当我编译它时,clang++(clangversion5.0.1(tags/RELEASE_501/final))报告:

在上面的代码中,
testcase
check\u eq
是为扩展到
DOCTEST\u TEST\u CASE()
(某种自注册变量+函数对)和
DOCTEST\u check\u eq
而定义的宏(基本上是“断言a==b”,带有魔术处理)

我知道这段代码正在执行,因为
west+1
是故意引入的错误。当我运行测试时,会收到如下失败消息:

===============================================================================
/.../room.cpp(51)
TEST CASE:  [room] exits

/.../room.cpp(57) ERROR!
  CHECK_EQ( center->west(), west + 1 )
with expansion:
  CHECK_EQ( 0x00007fd6f1d011a0, 0x00007fd6f1d011f8 )
Value stored to 'x' is never read
就我所见,我正在使用结构化绑定中的所有值:
中心
显示在我的支票的左侧,而
北、南、东、西
显示在右侧。为什么clang++报告的内容是“从不阅读”

更新

下面是重现问题的代码。我运行此命令行(取自
make VERBOSE=1
的输出并简化):

我将此源文件用作
test.cpp

#include <tuple>

static std::tuple<int, int, int>
foo()
{
    return {1,2,3};
}

bool
test()
{
    auto [a,b,c] = foo();

    return a<b and b<c;
}
#包括
静态std::tuple
foo()
{
返回{1,2,3};
}
布尔
测试()
{
auto[a,b,c]=foo();
返回一个,这被认为是常见的假阳性:

Q:如何告诉静态分析器我不关心特定的死区存储?

当分析器发现存储在变量中的值永远不会 使用后,它将生成一条类似于此的消息:

===============================================================================
/.../room.cpp(51)
TEST CASE:  [room] exits

/.../room.cpp(57) ERROR!
  CHECK_EQ( center->west(), west + 1 )
with expansion:
  CHECK_EQ( 0x00007fd6f1d011a0, 0x00007fd6f1d011f8 )
Value stored to 'x' is never read
您可以使用(void)x;成语来确认存在一个死的 存储在代码中,但不希望在 未来


关于它为什么是假阳性的推理是没有用的。警告可能会随着代码或不同版本的Clang之间的细微变化而消失/重新出现。

假阳性?@bolov我想,我希望是这样。但整个事情对我来说足够新鲜,我愿意邀请更多的有经验的人来解释到底发生了什么。Clangbug,请报告。请注意,它告诉您底层对象未被读取,而不是它的每个分解组件。为了完整性,您是否可以发布足够的代码,以便其他人可以复制粘贴到编译器中以复制它,以及完整的叮当声警告?@AndyG:updated问题中的死存储在哪里?