
Нашла по ссылке с 0xDE.
typename
- это одно из редких и экзотичных ключевых слов, которые с большой долей вероятности никогда не пригодятся в работе (мне оно еще не пригождалось), но все равно любопытно зачем оно нужно. Его иногда путают с typedef
. Несмотря на то, что они слегка похожи по названию, они означают разные вещи.typename
нужен для облегчения задачи компилятору при парсинге загадочных выражений вроде следующего:template<class T> void f() { T::x * p; ... }
T::x * p
может означать две вещи. typename
разрешит это недоразумение, явно сказав компилятору, что речь идет о типе.template<class T> void f() { typename T::x * p; ... }
typename
, ведут себе по-разному. Подробно кто именно как себя ведет я не разбиралась, но я видела упоминания старых компиляторов, которые вообще не поддерживают typename
. Поскольку это были упоминания из довольно старых статей, то сейчас это, наверное, не очень актуально. Некоторые компиляторы пытаются догадаться сами, что автор хотел сказать и могут догадаться успешно. Но при этом выдать warning. Где-то поддержку typename
надо включать отдельным ключом.typename
можно использовать вместо class
при описании шаблона. То есть вместо template<class T>
можно написать template<typename T>
, разницы никакой нет. Но исторически так сложилось, что class употребляется чаще.If you want to lead a team, a company, an army, or a country, the primary problem you face is getting everyone moving in the same direction, which is really just a polite way of saying "getting people to do what you want."
We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.
Premature optimization is the root of all evil in programming.и сказал это Энтони Хоар. Больше всего он известен тем, что придумал быструю сортировку.