为什么在构建结构时在Visual C++ 2008中会收到这些警告?

Mir*_*pas 6 c++ visual-c++-2008 visual-c++

我有这个代码

typedef struct
{
    const char* fooString;
    const bool  fooBool;
}fooStruct;
Run Code Online (Sandbox Code Playgroud)

而这个初始化程序:

static const fooStruct foo[] =
{
    {"file1", true},
    {"file2", false},
    ....
};
Run Code Online (Sandbox Code Playgroud)

使用此代码,我在VS2008中有3个警告:

error C2220: warning treated as error - no 'object' file generated  
warning C4510: '<unnamed-tag>' : default constructor could not be generated
warning C4512: '<unnamed-tag>' : assignment operator could not be generated
warning C4610: struct '<unnamed-tag>' can never be instantiated - user defined constructor required 
Run Code Online (Sandbox Code Playgroud)

Ada*_*eld 11

这正是编译器所说的:它不能为你的struct生成一个默认的构造函数或赋值运算符,因为它有一个const成员(const bool fooBool).const无法初始化作为引用或引用的struct成员,因此必须在用户编写的构造函数或赋值运算符中显式初始化它们.

一种解决方案是编写自己的默认构造函数和赋值运算符(并且根据三规则,您还应该编写一个复制构造函数;析构函数不是绝对必要的,但是很好的做法).替代的,更容易的解决方案就是制造fooBoolconst.然后,编译器将很乐意为您生成默认构造函数和赋值运算符.

由于您已经创建了const这些实例的数组static const fooStruct foo[] = ...,因此额外const开启fooBool是没有意义的.

  • @Felics:符合条件的数据成员很少值得一试.如果要确保数据成员在初始化后未被修改,最好将数据成员设为私有,并且只允许通过访问者成员函数访问它. (5认同)

Jam*_*lis 8

C4610警告不正确.这是Visual C++中的已知错误.请参阅Microsoft Connect错误"C4610的不正确发布".

Adam Rosenfield解释了为什么会发出其他两个警告(C4510和C4512).