Одинаковые имена элементов класса и имена аргументов функции в C ++

StackOverflow https://stackoverflow.com/questions/2181742

  •  24-09-2019
  •  | 
  •  

Вопрос

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

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

Это сказано, я закончил что-то подобное:

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.
};

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

Спасибо.

Это было полезно?

Решение

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

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

Если вы не использовали список инициализации, вам придется писать:

explicit Foo(T x)
{
    this->x = x;
}

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top