为什么本地定义的函数结构需要赋值运算符和复制构造函数

Sat*_*bir 3 c++ compiler-construction struct

有人可以帮助我理解这个错误,当我在函数中声明struct本地时,我从编译器得到以下错误.但是当我在函数之外声明struct时,错误就消失了.

注意:我没有故意实现缺失功能.我只是想知道为什么编译器在我不在我的代码中使用时需要它们.

RAII :: RAII':本地类成员函数没有正文

RAII :: operator =':本地类成员函数没有正文

void someclass::somefun()
{
    static bool inProgress = false; 
    struct RAII
    { 
        RAII(bool& f):flag(f){ flag = true;}
        ~RAII() { flag = false; }
        bool& flag;
    private:
        RAII(const RAII& rhs);
        RAII& operator= (const RAII& rhs);
    };
    RAII autoreset(inProgress);

    // Do something 

}
Run Code Online (Sandbox Code Playgroud)

Seb*_*edl 8

因此该标准包含此规则:9.3.1p8

本地类的成员函数应在其类定义中内联定义(如果它们是完全定义的).

这禁止本地类成员的外部定义.

微软的编译器显然对此有些偏执,并且有一级警告C4822,它会在你声明一个成员而不定义它的时候发出警告.这完全是脑卒中 - 当你真正定义一个成员的时候,它应该只是给出一个很好的错误信息.

正确的做法是在每个项目中禁用此警告并继续执行您正在执行的操作.

编辑:显然,微软的人们也意识到这个警告是多么愚蠢,并在新版本中将其删除.对于比Visual Studio 2008更新的版本,MSDN不包含此警告的文档.