在C ++中为创建“匿名”变量显示警告

时间:2018-07-12 10:51:39

标签: c++ gcc

我上了这样的课:

class ScopedLock {
public:
    ScopedLock (Locker *lock) { /*...*/ }
    ~ScopedLock () { /*...*/ }
};

通常将其称为(在正确的位置调用ScopedLock的构造函数/析构函数):

{
    ScopedLock l(&locker);
    // ...
}

我不小心称呼它为:

{
    ScopedLock(&locker);
    // ...
}

这种“东西”的名字是什么?未使用的匿名局部变量?

是否有可能防止这种情况发生?是否有针对此类“事物”的编译器警告?

2 个答案:

答案 0 :(得分:4)

您已经创建了一个类型为ScopedLock未命名的临时对象/无名字的临时对象对象,该对象短暂存在然后死于;。编译器不会发出警告,因为它假定您正在使用它进行一些有用的操作。它不会进入ctor主体来检查是否可能是这种情况。例如,您想创建一个临时文件,构造函数可以在其中做一些工作:

ScopedLock() {
    // do some work
}

您不能强迫编译器针对此类用例显示警告,并且GCC中没有此类标志。

以下SO职位可以证明是有益的:

答案 1 :(得分:3)

您可以创建一个标记为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 ScopedLock{x, y};   
    }
};

int main()
{
    ScopedLock(12, 123); // Error
    ScopedLock::construct(12, 123); // Warning
    auto lock(ScopedLock::construct(12, 123)); // Ok
}

online compiler