在 C++ 中显示“匿名”变量创建警告
Posted
技术标签:
【中文标题】在 C++ 中显示“匿名”变量创建警告【英文标题】:Show Warning for "anonymous" variable creation in c++ 【发布时间】:2018-07-12 10:51:39 【问题描述】:我有这样的课:
class ScopedLock
public:
ScopedLock (Locker *lock) /*...*/
~ScopedLock () /*...*/
;
通常它被称为(这将在正确的位置调用 ScopedLock 的构造函数/析构函数):
ScopedLock l(&locker);
// ...
我不小心这样称呼它:
ScopedLock(&locker);
// ...
这样的“东西”叫什么名字?未使用的匿名局部变量?
有没有可能防止这种情况发生?是否有可用于此类“事物”的编译器警告?
【问题讨论】:
您创建了一个ScopedLock
类型的未命名临时,它短暂地存在,然后在;
处死去。
“通常它被称为:...” 所以你打算在那里进行函数前向声明?注意最令人头疼的解析!
另外我认为不应该生成警告,可能存在故意这样做的情况。
我原以为 [[nodiscard]] ScopedLock (...) ...
会发出想要的警告,但相反,我收到一个警告,它不能将属性应用于构造函数:-/
关于这个的精彩视频在这里:youtube.com/watch?v=lkgszkPnV8g&t=29m40s
【参考方案1】:
您创建了一个类型为ScopedLock
的未命名临时/无名临时对象,该对象短暂存在,然后在;
处死去。编译器不会发出警告,因为它假定您正在使用它做一些有用的事情。它不会进入 ctor 主体来检查是否可能是这种情况。例如,你想创建一个临时的,你的构造函数可能会做一些工作:
ScopedLock()
// do some work
您不能强制编译器针对此类用例显示警告,并且 GCC 中没有此类标志。
以下 SO 帖子可以证明是有益的:
How to avoid C++ anonymous objects Prevent the creation of temporary objects【讨论】:
【参考方案2】:您可以创建一个标记为nodiscard
的构造函数,它应该被调用而不是构造函数。
#include <iostream>
class ScopedLock final
private: ScopedLock(int, int) std::cout << "constructed" << std::endl;
private: ScopedLock(void) = delete;
private: ScopedLock(ScopedLock const &) = delete;
private: ScopedLock(ScopedLock &&) = delete;
private: ScopedLock & operator =(ScopedLock const &) = delete;
private: ScopedLock & operator =(ScopedLock &&) = delete;
public: [[nodiscard]] static ScopedLock
construct(int x, int y)
return ScopedLockx, y;
;
int main()
ScopedLock(12, 123); // Error
ScopedLock::construct(12, 123); // Warning
auto lock(ScopedLock::construct(12, 123)); // Ok
online compiler
【讨论】:
以上是关于在 C++ 中显示“匿名”变量创建警告的主要内容,如果未能解决你的问题,请参考以下文章
如何在 minGW 中禁用 Eclipse 中的未使用变量警告?