Одинаковые имена элементов класса и имена аргументов функции в C ++
Вопрос
У меня есть простой объект, который содержит некоторые [публичные] данные.
Я хочу удержать мой интерфейс чистым, поэтому я не хочу предварительно / поставить - исправить что-нибудь с именами публично доступных переменных, ни имена моих аргументов функций.
Это сказано, я закончил что-то подобное:
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.