簡體   English   中英

在c ++中顯示“匿名”變量創建的警告

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM