我上了这样的课:
class ScopedLock {
public:
ScopedLock (Locker *lock) { /*...*/ }
~ScopedLock () { /*...*/ }
};
通常将其称为(在正确的位置调用ScopedLock的构造函数/析构函数):
{
ScopedLock l(&locker);
// ...
}
我不小心称呼它为:
{
ScopedLock(&locker);
// ...
}
这种“东西”的名字是什么?未使用的匿名局部变量?
是否有可能防止这种情况发生?是否有针对此类“事物”的编译器警告?
答案 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
}