Необходимость явной инициализации объектов

 
0
 
C++
ava
ChipNDale | 23.01.2013, 16:18
Доброго времени суток.
Хочется получать от компилятора максимум предупреждений, и для этого я играюсь с его опциями. Одна из таких включает проверку на соответствие некоторым рекомендациям Скотта Майерса (-Weffc++). При этом получаю предупреждение для приведенного кода:
#include <string>

class A
{
public:
    A() { }

private:
    std::string str_;
};

int main()
{
    A obj;
    return 0;
}



main.cpp: In constructor ‘A::A()’:
main.cpp:6:5: warning: ‘A::str_’ should be initialized in the member initialization list [-Weffc++]


Вопрос: это всего лишь неспособность компилятора определить наличие у объекта конструктора по умолчанию, или же явное указание его в списке инициализации действительно имеет смысл и не будет избыточным?
Kommentare (4)
ava
borisbn | 23.01.2013, 16:15 #
гнусным писали об этом - http://gcc.gnu.org/ml/gcc-help/2007-11/msg00040.html
мало того, они сами пишут - http://gcc.gnu.org/onlinedocs/gcc/C_002b_0...ct-Options.html
Цитата
When selecting this option, be aware that the standard library headers do not obey all of these guidelines;


Цитата (ChipNDale @  23.1.2013,  15:18 findReferencedText)
это всего лишь неспособность компилятора определить наличие у объекта конструктора по умолчанию

думаю, да. единственное "оправдание" такому поведению можно придумать такое: а вдруг ты завтра изменишь тип `str_` ?
ava
maxim1000 | 23.01.2013, 16:38 #
рискну предположить, что это предупреждение выдаётся для того, чтобы не пропустить случаи, когда программист собирался инициализировать строку чем-то непустым, но забыл

при явном указании str_ в списке инициализации вероятность этого забывания гораздо ниже
ava
borisbn | 23.01.2013, 16:44 #
maxim1000, на такое
struct A {
    A(){}
};

struct B {
    B(){}
    A a;
};

тоже ругается - http://liveworkspace.org/code/49FOog$2
ava
volatile | 23.01.2013, 18:16 #
А что не нравицца то?
За что боролись, на то и напоролись.  smile 

Сами же выбрали -Weffc++, ну так и расписывайте полностью всю инициализацию:
Цитата (ChipNDale @  23.1.2013,  15:18 findReferencedText)
class A

{

public:
  A() : str_() { }



private:
  std::string str_;

};


Цитата (borisbn @  23.1.2013,  16:44 findReferencedText)
struct B {
  B() : a() {}
  A a;

};


Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden