2010-02-02 2 views
3

У меня есть простой объект, который содержит некоторые [общедоступные] данные.Идентичные имена членов класса и имена аргументов аргументов в 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. 
}; 

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

Спасибо.

+0

Этот же вопрос был задан около дня назад; извините, у меня нет ссылки. Ответ оказался таким, что да, он был четко определен. –

+0

Спасибо, я догадываюсь, что пропустил это в своем поиске. Тогда я отвечу на ответ Пуаты. – eciDive

+0

Я бы не использовал только потому, что вы должны задать вопрос. Тот факт, что это не значит читать, означает, что сопровождающий придет через год и скажет сено, которое не выглядит написанием, или исправить его, или потратить на то, чтобы убедиться, что он работает. Правило simpel не записывает код, который требует, чтобы вы задавали вопрос о погоде. –

ответ

6

Да, это прекрасно, и совершенно стандарт.

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

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

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

Whooooo. Это не то же самое. Здесь вы выполняете настройку по умолчанию, используя оператор присваивания. Это определенно не идеально, особенно T не просто. –

+0

Это не то же самое с точки зрения фактического исполнения, но это хороший пример того, как выполняется поиск имени: внутри тела конструктора локальная переменная скрывает член и, следовательно, член должен быть полностью квалифицирован, тогда как в списке инициализации имена инициализированных (не имеющих лучшего имени) должны быть подобъектами текущего класса и не требуют явного этого. Мне всегда было интересно, как в 'x (x)' первый и второй 'x' решаются по-разному, даже если это имеет смысл. –

1

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

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

+0

Спасибо, я знаю о двусмысленности и необходимости в «этом ->» - доступе. Поразмыслив, я думаю, я должен был придумать лучший титул. ;) – eciDive

Смежные вопросы