Идентичные имена членов класса и имена аргументов функций в C ++ - PullRequest
3 голосов
/ 02 февраля 2010

У меня есть простой объект, который содержит некоторые [публичные] данные.

Я хочу, чтобы мой интерфейс был чистым, поэтому я не хочу предварительно / постфиксировать что-либо для имен общедоступных переменных или имен аргументов моей функции.

Тем не менее, я закончил тем, что делал что-то вроде этого:

template<typename T> struct Foo
{
  explicit Foo(T x) : x(x) // This [i.e., x(x)] seems to be doing the "Right Thing", but is this well defined?
  {/*            ^ 
       No pre-/post- fixing.
   */
  }

  T x; // No pre-/post- fixing.
};

Просто повторюсь: все, что я спрашиваю, это хорошо ли определенное поведение. Не должен ли я это делать или не делать ...

Спасибо.

Ответы [ 2 ]

7 голосов
/ 02 февраля 2010

Да, это нормально и совершенно стандартно.

Локальные переменные всегда идут первыми в поиске имен, но x(...) в списке инициализации, очевидно, может ссылаться только на переменные-члены [edit: или базовый класс].

Если вы не использовали список инициализации, вам нужно было бы написать:

explicit Foo(T x)
{
    this->x = x;
}
1 голос
/ 02 февраля 2010

В частности, для списка инициализатора ctor это четко определенное поведение - поскольку вы можете только инициализировать член или базовый класс, нет никакой двусмысленности между одним из них и именем параметра.

Однако почти при любых других обстоятельствах вы создадите двусмысленность. В частности, ваш заголовок просто ссылается на «функцию» - и для любой функции, кроме ctor, это не будет работать. Даже внутри тела ctor он не будет работать - «специальная» обработка находится исключительно в списке инициализаторов ctor.

...