【发布时间】:2017-02-18 22:07:55
【问题描述】:
此代码来自 Bjarne Stroustrup 的“C++ 编程语言”(C.13.8.3 实例化绑定点)
template <class T>
void f(T value)
{
g(value);
}
void g(int v);
void h()
{
extern g(double);
f(2);
}
他提到:
这里,f() 的实例化点就在 h() 之前,所以 f() 中调用的 g() 是全局 g(int) 而不是局部 g(双)。 “实例化点”的定义意味着一个 模板参数永远不能绑定到本地名称或类 会员。
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)已经在范围内了。“实例化点”的定义意味着模板参数永远不能绑定到本地名称或类成员 - 这在 C++14 中是否发生了变化?我在使用 C++(G++ 4.9.2) 时出错,但在使用 C++14(G++ 4.9.2) 时没有出错。
【问题讨论】:
-
“1985 年,C++ 编程语言的第一版发布,成为该语言的权威参考,因为还没有官方标准。” wiki 所以
C++11和C++14之间没有变化。它在“预标准化”和标准化之间发生了变化。 -
检查 14.6.4.1 [temp.point] 的规则
-
同时搜索两个阶段名称查找
-
@bolov 我正在阅读第三版(1997 年)。
标签: c++ templates c++14 name-binding template-instantiation