在 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++ 中显示“匿名”变量创建警告的主要内容,如果未能解决你的问题,请参考以下文章

如何抑制有关 C++ 中未使用变量的警告?

C++ 对类中未初始化的变量启用警告

如何在 minGW 中禁用 Eclipse 中的未使用变量警告?

C ++如何禁用具有不同符号变量比较的特定行的编译器警告?

C ++宏导致:“警告:未使用的变量“LOG__METHOD__”“

如果没有错误,我怎么才能显示警告?