[英]Show Warning for “anonymous” variable creation in c++
我有一個這樣的課:
class ScopedLock {
public:
ScopedLock (Locker *lock) { /*...*/ }
~ScopedLock () { /*...*/ }
};
通常它被調用(這將在正確的位置調用ScopedLock的構造函數/析構函數):
{
ScopedLock l(&locker);
// ...
}
我不小心稱之為:
{
ScopedLock(&locker);
// ...
}
這種“東西”的名稱是什么? 未使用的匿名局部變量?
有可能阻止這種情況嗎? 是否有針對此類“事物”的編譯器警告?
您已經創建了一個ScopedLock
類型的未命名臨時/無名臨時對象,該對象短暫存在然后死於;
。 編譯器不會發出警告,因為它假定您正在使用它做一些有用的事情。 如果可能的話,它不會進入檢查機構。 例如,您想要創建一個臨時的構造函數可能會做一些工作:
ScopedLock() {
// do some work
}
您不能強制編譯器為此類用例顯示警告,並且GCC中沒有此類標志。
以下SO帖子可證明是有益的:
您可以創建一個標記為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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.