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

C++ 为“显示警告”;“匿名”;在c+中创建变量+;,c++,gcc,C++,Gcc,我上过这样的课: class ScopedLock { public: ScopedLock (Locker *lock) { /*...*/ } ~ScopedLock () { /*...*/ } }; 通常会这样调用(这将在正确的位置调用ScopedLock的构造函数/析构函数): 我不小心把它叫做: { ScopedLock(&locker); // ... } 这种“东西”叫什么名字?未使用的匿名局部变量 有没有可能防止这种情况发生?对于这样

我上过这样的课:

class ScopedLock {
public:
    ScopedLock (Locker *lock) { /*...*/ }
    ~ScopedLock () { /*...*/ }
};
通常会这样调用(这将在正确的位置调用ScopedLock的构造函数/析构函数):

我不小心把它叫做:

{
    ScopedLock(&locker);
    // ...
}
这种“东西”叫什么名字?未使用的匿名局部变量

有没有可能防止这种情况发生?对于这样的“事情”,有编译器警告吗

您创建了一个类型为
ScopedLock
的未命名临时/无名临时对象,该对象短暂存在,然后在
处消亡。编译器不会发出警告,因为它假定您正在使用它做一些有用的事情。它不会进入一个ctor主体来检查情况是否如此。例如,您希望创建一个临时构造函数,您的构造函数可以在其中执行某些工作:

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
}
#包括
类ScopedLock final
{

private:ScopedLock(int,int){std::您是否已经创建了一个类型为
ScopedLock
的未命名临时文件,它短暂存在,然后在
处消失;
“通常它被称为:…”所以你打算在那里做一个函数转发声明?请注意最麻烦的解析!而且我不认为应该生成警告,可能有故意这样做的情况。我本来希望
[[nodiscard]]ScopedLock(…){…}
发出想要的警告,但我得到了一个警告,它无法将属性应用于构造函数:-/mazing视频:
#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
}