Этот код написан на языке программирования С++ Bjarne Stroustrup (C.13.8.3 Point of Instantiation Binding)
template <class T>
void f(T value)
{
g(value);
}
void g(int v);
void h()
{
extern g(double);
f(2);
}
И он упоминает:
Здесь точка инстанцирования для f() находится непосредственно перед h(), поэтому g(), называемая в f(), является глобальной g (int), а не локальной г (дважды). Из определения "точки создания" следует, что a параметр шаблона никогда не может быть привязан к локальному имени или классу член.
void h()
{
struct X {}; // local structure
std::vector<X> v; // error: can't use local structure as template parameter
}
Мои вопросы:
-
Зачем нужен первый код?
g()
объявляется позже, и я действительно получаю сообщение об ошибке с g++ 4.9.2, чтоg
не объявляется в этой точке. -
extern g (double) - как это работает? поскольку возвращаемое значение не имеет значения в случае перегрузки функции, тогда мы можем пропустить его в форвардных объявлениях?
-
точка инстанцирования для f() находится непосредственно перед h() - почему? разве не логично, что он будет создан после вызова
f(2)
? Прямо там, где мы его называем, откудаg(double)
уже будет в области видимости. -
Определение "точки создания" означает, что параметр шаблона никогда не может быть привязан к локальному имени или члену класса. Изменено ли это в С++ 14? Я получаю ошибку с С++ (g++ 4.9.2), но не получаю ошибку с С++ 14 (g++ 4.9.2).