C++ Clang未检测到将堆栈变量赋值为未使用的引用

C++ Clang未检测到将堆栈变量赋值为未使用的引用,c++,C++,我设置了Clang的-Wunused标志,但它无法检测指定(但未使用)的堆栈变量 下面我在堆栈上创建了一个typedef'd数组的实例,但从未使用过它: class AClass { void func(); ATypedefdArray& marray; // Initialised within ctor, omitted to simplify example }; AClass::func() { const ATypedefdArray arr = m

我设置了Clang的
-Wunused
标志,但它无法检测指定(但未使用)的堆栈变量

下面我在堆栈上创建了一个typedef'd数组的实例,但从未使用过它:

class AClass
{
    void func();
    ATypedefdArray& marray; // Initialised within ctor, omitted to simplify example
};

AClass::func()
{
    const ATypedefdArray arr = marray;     // Intentional copy

    // arr isn't used but no compiler error
}
没有编译错误

如果我将功能更改为:

AClass::func()
{
    int x;
}
我得到了预期的未使用变量警告/错误:

error: unused variable 'x' [-Werror,-Wunused-variable]

为什么第一个场景没有被检测为未使用的变量?

const ATypedefdArray arr=marray将调用复制构造函数,而析构函数将在作用域的末尾调用

如果两者都是微不足道的,那么clang/gcc将成功检测未使用的变量


如果其中任何一种都不是微不足道的,那么它们可能有副作用,因此被使用。它们可能会产生预期的副作用,例如故意将RAII用作
std::lock\u guard
,或者无意中用作
std::string
。所以没有警告,但使用了arr。。。调用了它的复制构造函数,然后调用了它的析构函数(这两个函数中的任何一个都可能有副作用,即使没有对它做任何其他操作)@JeremyFriesner谢谢你的回答。是否有额外的叮当开关用于检测我的目标?需要更明确的用法等?恐怕我对clang的选项不够熟悉,无法给出有用的答案,除了明显的“检查clang的文档”:/Btw如果您将原始注释作为答案,我很乐意接受。他们可能会认为这样的警告很烦人,因为在许多情况下,您会故意创建一个对象,只是为了调用其构造函数和析构函数,例如。