Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

Gray-Ice

个人博客兼个人网站

报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
╭─fire@butterfly ~/codeSet/CPPCode  
╰─➤ g++ -Werror -Wextra -Wall -pedantic -Wconversion test.cpp
test.cpp: 在复制构造函数‘HasPtr::HasPtr(const HasPtr&)’:
test.cpp:11:18: 错误:‘HasPtr::ps’ will be initialized after [-Werror=reorder]
11 | std::string* ps;
| ^~
test.cpp:10:9: 错误: ‘int HasPtr::i’ [-Werror=reorder]
10 | int i;
| ^
test.cpp:13:5: 错误:在此处初始化后被初始化 [-Werror=reorder]
13 | HasPtr(const HasPtr& hp):ps(new (nothrow) string(*(hp.ps))), i(hp.i){};
| ^~~~~~
cc1plus:所有的警告都被当作是错误

造成错误的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class HasPtr
{
public:
int i;
std::string* ps;
HasPtr():ps(new string()), i(0){};
HasPtr(const HasPtr& hp):ps(new (nothrow) string(*(hp.ps))), i(hp.i){};
HasPtr(const string &s):ps(new string(s)){};
HasPtr& operator=(const HasPtr& hp)
{
delete ps;
ps = new string(*(hp.ps));
i = hp.i;
return *this;
};
~HasPtr()
{
delete ps;
};
void tell()
{
cout << *ps << endl;
}
};

“真是奇怪,我代码看着也没啥问题啊?”这么想着的我Google了一下,在StackOverFlow上找到了回答:gcc warning” ‘will be initialized after’。原来是这么回事:因为我先定义了int i,再定义了string* ps,但是我构造函数里先初始化的ps,再初始化的i。因为初始化的顺序与定义的顺序不对,所以出现了错误。
虽然StackOverFlow里有说明原因, 但是我真的很想吐槽一下。
本篇完。

评论



愿火焰指引你