Список инициализации: имена полей и параметров совпадают
От: Alexander G Украина  
Дата: 24.11.09 16:07
Оценка:
struct prop
{
  std::string name;
  std::string value;
  prop(std::string name, std::string value)
    : name(name), value(value) 
  {}
};


Имена паблик полей совпадают с именами параметров конструктора.

Должно ли это компилироваться?
Стоит ли это использовать?
Что и как следует перименовать, если не стоит оставлять так?
(паблик поля тут все, кроме конструкторов методов не предвидится, инкапсулировать нечего)
Русский военный корабль идёт ко дну!
Re: Список инициализации: имена полей и параметров совпадают
От: fuyant  
Дата: 24.11.09 16:28
Оценка: -1
Здравствуйте, Alexander G, Вы писали:

AG>
AG>struct prop
AG>{
AG>  std::string name;
AG>  std::string value;
AG>  prop(std::string name, std::string value)
AG>    : this->name(name), this->value(value) 
AG>  {}
AG>};
AG>
Re: Список инициализации: имена полей и параметров совпадают
От: rg45 СССР  
Дата: 24.11.09 16:41
Оценка: 25 (4) +4
Здравствуйте, Alexander G, Вы писали:

AG>
AG>struct prop
AG>{
AG>  std::string name;
AG>  std::string value;
AG>  prop(std::string name, std::string value)
AG>    : name(name), value(value) 
AG>  {}
AG>};
AG>


AG>Имена паблик полей совпадают с именами параметров конструктора.


AG>Должно ли это компилироваться?

AG>Стоит ли это использовать?
AG>Что и как следует перименовать, если не стоит оставлять так?
AG>(паблик поля тут все, кроме конструкторов методов не предвидится, инкапсулировать нечего)

Никаких проблем с этим нет и такая инициализация полностью well-formed. При вычислении выражений в круглых скобках используемые имена, естественно, ищутся в первую очередь в текущей области видимости, т.е. среди параметров конструктора, затем в области видимости и класса, затем в обрамляющем пространстве имен и т.д. — так же точно как и у обычных функций. Имена же инициализируемых членов ищутся исключительно в области видимости класса, что тоже вполне логично, поэтому конфликта не происходит.
--
Re[2]: Список инициализации: имена полей и параметров совпад
От: Alexey F  
Дата: 24.11.09 16:54
Оценка:
Здравствуйте, fuyant, Вы писали:

AG>>
AG>>struct prop
AG>>{
AG>>  std::string name;
AG>>  std::string value;
AG>>  prop(std::string name, std::string value)
AG>>    : this->name(name), this->value(value)
AG>>  {}
AG>>};
AG>>


Нет, так нельзя, ожидается имя. По-крайней мере, мой gcc 4.4.1 (да и MS VC++ 2008, Express) говорят так а в стандарте что-то не нахожу
Re: Список инициализации: имена полей и параметров совпадают
От: Николай Ивченков  
Дата: 24.11.09 17:00
Оценка: 8 (2) +1
Alexander G:

AG>Имена паблик полей совпадают с именами параметров конструктора.


AG>Должно ли это компилироваться?


См. п. 12.6.2 абзацы 1, 2, 7.

AG>Стоит ли это использовать?


Если имя параметра поменяется, а в инициализирующем выражении имя поменять забудут, то выйдет нехорошая ситуация. Насколько это вероятно, решай сам.
Re: Список инициализации: имена полей и параметров совпадают
От: Юрий Жмеренецкий ICQ 380412032
Дата: 24.11.09 17:03
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>
AG>struct prop
AG>{
AG>  std::string name;
AG>  std::string value;
AG>  prop(std::string name, std::string value)
AG>    : name(name), value(value) 
AG>  {}
AG>};
AG>


AG>Имена паблик полей совпадают с именами параметров конструктора.


AG>Должно ли это компилироваться?

Должно.

AG>Стоит ли это использовать?


В мелких классах можно, в крупных — под вопросом, и кроме того, может быть запрещено стандартами кодирования (должен быть префикс или иное выделение).

PS: невозможно допустить copy-paste ошибку такого вида:

prop(std::string name)
  : m_name(m_name) 
 {}


Re[3]: Список инициализации: имена полей и параметров совпад
От: Николай Ивченков  
Дата: 24.11.09 17:04
Оценка: 10 (1)
Alexey F:

AF>По-крайней мере, мой gcc 4.4.1 (да и MS VC++ 2008, Express) говорят так а в стандарте что-то не нахожу


ctor-initializer:
    : mem-initializer-list

mem-initializer-list:
    mem-initializer
    mem-initializer , mem-initializer-list

mem-initializer:
    mem-initializer-id ( expression-list opt )

mem-initializer-id:
    ::opt nested-name-specifier opt class-name
    identifier
Re[2]: Список инициализации: имена полей и параметров совпад
От: Alexander G Украина  
Дата: 24.11.09 17:08
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>В мелких классах можно, в крупных — под вопросом, и кроме того, может быть запрещено стандартами кодирования (должен быть префикс или иное выделение).


В классах — таки да, запрещено, но какой же это класс? Просто структура, у которой есть конструкторы для удобства.

ЮЖ>PS: невозможно допустить copy-paste ошибку такого вида:


ЮЖ>
ЮЖ>prop(std::string name)
ЮЖ>  : m_name(m_name) 
ЮЖ> {}
ЮЖ>


ЮЖ>)


можно. и что плохо, даже c /Wall ворнингов нет
Русский военный корабль идёт ко дну!
Re[3]: Список инициализации: имена полей и параметров совпад
От: Юрий Жмеренецкий ICQ 380412032
Дата: 24.11.09 17:23
Оценка: 7 (1)
Здравствуйте, Alexander G, Вы писали:

AG>Здравствуйте, Юрий Жмеренецкий, Вы писали:


ЮЖ>>В мелких классах можно, в крупных — под вопросом, и кроме того, может быть запрещено стандартами кодирования (должен быть префикс или иное выделение).


AG>В классах — таки да, запрещено, но какой же это класс? Просто структура, у которой есть конструкторы для удобства.

Это уже терминологическая проблема.

ЮЖ>>PS: невозможно допустить copy-paste ошибку такого вида:


ЮЖ>>
ЮЖ>>prop(std::string name)
ЮЖ>>  : m_name(m_name) 
ЮЖ>> {}
ЮЖ>>


ЮЖ>>)


AG>можно.


Каким образом ее можно допустить, в случае если имена члена и параметра совпадают (я этот случай имел ввиду)?
Re: Список инициализации: имена полей и параметров совпадают
От: Caracrist https://1pwd.org/
Дата: 24.11.09 17:38
Оценка: +1
Здравствуйте, Alexander G, Вы писали:

AG>
AG>struct prop
AG>{
AG>  std::string name;
AG>  std::string value;
AG>  prop(std::string name, std::string value)
AG>    : name(name), value(value) 
AG>  {}
AG>};
AG>


AG>Имена паблик полей совпадают с именами параметров конструктора.


AG>Должно ли это компилироваться?

AG>Стоит ли это использовать?
AG>Что и как следует перименовать, если не стоит оставлять так?
AG>(паблик поля тут все, кроме конструкторов методов не предвидится, инкапсулировать нечего)


struct prop
{
  std::string name;
  std::string value;
  prop(const std::string& in_name, const std::string &in_value)
    : name(in_name), value(in_value) 
  {}
};


~~~~~
~lol~~
~~~ Single Password Solution
Re: Список инициализации: имена полей и параметров совпадают
От: korzhik Россия  
Дата: 24.11.09 18:51
Оценка: +2
Здравствуйте, Alexander G, Вы писали:

AG>Стоит ли это использовать?


я бы не советовал. Обычная реакция среднего C++ программиста на такой код это лёгкий ступор. После этого могут возникнуть вопросы.
А если можно как то избавиться от лишних вопросов, то лучше от них избавляться.
Re: Список инициализации: имена полей и параметров совпадают
От: byleas  
Дата: 24.11.09 19:22
Оценка:
Здравствуйте, Alexander G, Вы писали:

AG>Имена паблик полей совпадают с именами параметров конструктора.

AG>Должно ли это компилироваться?
AG>Стоит ли это использовать?
Работать-то будет и для конструкторов не такая уж плохая практика, а вот в обычных функцях…
struct some {
  string s;
  some(string s)
   :s(s) // ok
  {}
  void set(string s) {
    this->s = s; // … можно легко забыть о необходимости this…
  }
};

… особенно, если там не тривиальное присваивание, а и дополнительные проверки/вызовы.
Re: Список инициализации: имена полей и параметров совпадают
От: MasterZiv СССР  
Дата: 25.11.09 10:35
Оценка:
Alexander G wrote:

> prop(std::string name, std::string value)

> : name(name), value(value)
> {}

> Должно ли это компилироваться?


должно.

> Стоит ли это использовать?


Почему нет ?
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Список инициализации: имена полей и параметров совпад
От: fuyant  
Дата: 25.11.09 10:53
Оценка:
Здравствуйте, Alexey F, Вы писали:

AF>Здравствуйте, fuyant, Вы писали:


AG>>>
AG>>>struct prop
AG>>>{
AG>>>  std::string name;
AG>>>  std::string value;
AG>>>  prop(std::string name, std::string value)
AG>>>    : this->name(name), this->value(value)
AG>>>  {}
AG>>>};
AG>>>


AF>Нет, так нельзя, ожидается имя. По-крайней мере, мой gcc 4.4.1 (да и MS VC++ 2008, Express) говорят так а в стандарте что-то не нахожу


гм.... мне всегда казалось, что так можно, был убежден. Вот решил проверить — таки не собрается
это потому что this известен только в пределах {} ?
По крайней мере мне это говорит о том, что я никогда так не делал, оказывается — таки всегда старался избегать таких совпадений.
А раньше, в прежних версиях студиев, это работало, никто не помнит?
Re[4]: Список инициализации: имена полей и параметров совпад
От: Alexey F  
Дата: 25.11.09 13:20
Оценка:
Здравствуйте, fuyant, Вы писали:

F>это потому что this известен только в пределах {} ?

Там просто ожидается имя члена класса или предка, без выражений, this и т.п.

F>По крайней мере мне это говорит о том, что я никогда так не делал, оказывается — таки всегда старался избегать таких совпадений.

Я иногда так делаю для структур: на описанный в ветке возможный глюк с
// Было:
Class ( int name ) : name ( name ) ...
// Стало:
Class ( int somethingOtherName ) : name ( name ) ...

пока не натыкался, но это не значит, что когда-нибудь не наткнусь
Максимум, что может спасти с таким наименованием от нескольких часов "счастливой отладки" ( ) — это warning о неиспользуемой переменной. Если, конечно, в конструкторе она действительно нигде больше не используется.
Есть ещё -Winit-self для GCC, но достаточно долгое время он был отломан для C++ (у меня что-то не получается его и сейчас заставить работать) и навряд ли спасёт от инициализирования члена класса самим собой.

F>А раньше, в прежних версиях студиев, это работало, никто не помнит?

Проверил только что под самой старой, которая есть под рукой — 6-й. Нет, такого нет.
Re[4]: Список инициализации: имена полей и параметров совпад
От: rg45 СССР  
Дата: 25.11.09 14:09
Оценка:
Здравствуйте, fuyant, Вы писали:

F>гм.... мне всегда казалось, что так можно, был убежден. Вот решил проверить — таки не собрается

F>это потому что this известен только в пределах {} ?
F>По крайней мере мне это говорит о том, что я никогда так не делал, оказывается — таки всегда старался избегать таких совпадений.
F>А раньше, в прежних версиях студиев, это работало, никто не помнит?

Работал раньше и сейчас работает такой вариант:
prop(std::string name, std::string value)
: name(this->name), value(this->value)
{}

Правда, при стандартных настройках компиляторы студий выдают предупреждение об использовании this в списке инициализации.
--
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.