避免/警告C++成员的自我初始化

use*_*770 6 c++ gcc

做了以下事情后被咬了之后:

struct Person {

  std::string first_name;
  std::string last_name;
  Person(const std::string &first_name_, const std::string &last_name_) : 
    first_name(first_name_),
    last_name(last_name)
    {}
};
Run Code Online (Sandbox Code Playgroud)

初始化器last_name(last_name)显然应该在哪里,last_name(last_name_) 我可以让gcc警告这样的错误(是否有任何用例初始化成员的用例?)

或者在构造函数参数与字段类似的情况下对更好的命名约定的任何建议.

Mik*_*our 9

我通过使用它们初始化的成员相同的参数名称来避免此问题.当在成员初始化器中使用时,查找规则指定名称引用参数.

如果构造函数太复杂,则存在细微错误的余地; 但如果您只是初始化初始化列表中的成员,则没有问题.

否则,GCC将发出关于使用未初始化值以及合理警告设置-Wall(如或可能-Wextra)或更具体地使用未初始化值的警告-Wuninitialized.-Winit-self如果你想更加具体,我想也可能有一个或类似的.

  • +1.这是最好的,因为它也避免考虑同一实体的两个名称.简单的解决方案通常最好. (3认同)

tro*_*foe 7

是; -Wuninitialized并且 -Winit-self:

$ g++ -Wuninitialized -Winit-self -c init.cpp
init.cpp: In constructor 'Person::Person(const string&, const string&)':
init.cpp:7:3: warning: 'Person::last_name' is initialized with itself [-Wuninitialized]
Run Code Online (Sandbox Code Playgroud)