C++ Clang未检测到将堆栈变量赋值为未使用的引用
我设置了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
-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如果您将原始注释作为答案,我很乐意接受。他们可能会认为这样的警告很烦人,因为在许多情况下,您会故意创建一个对象,只是为了调用其构造函数和析构函数,例如。