今天,有人向我提供了以下形式的代码:
#include <iostream>
namespace example {
template <typename T>
T variable_template = T(42);
}
int main() {
example::variable_template<int> = 10;
std::cout << example::variable_template<int> << std::endl;
}
您可以在此处看到它:http://coliru.stacked-crooked.com/a/3a786c42b5204b0a
我希望这段代码打印42,因为10似乎被分配给临时代码。在命名空间内,模板只是一个声明(不是瞬时),因此没有数据可以在命名空间内变异。尽管如此,它让我感到惊讶并打印了10个。
我本来也希望对临时任务发出警告,但这种情况也没有发生。
这种未定义的行为,是我对模板的理解存在缺陷,还是其他事情正在发生?
答案 0 :(得分:4)
在命名空间内,模板只是一个声明(不是即时),所以没有数据可以在命名空间内变异。
不是这样!
[C++14: 14.7.2/6]:
类,函数模板或变量模板特化的显式实例化放置在定义模板的命名空间中。 [..]
当你有一个类模板Foo
,并引用一个实例化(比如Foo<int>
)时,该实例化就像普通类一样存在,其范围与模板相同。
变量模板没有什么不同。当您引用example::variable_template<int>
时,您需要添加&#34;该变量到包含模板的范围。
您的命名空间example
则包含一个名为variable_template<int>
的变量。
我本来也希望对临时任务发出警告,但这种情况也没有发生。
除了T(42)
。