变量模板可以变异吗?
Can a variable template be mutated?
今天,有人向我提供了以下形式的代码:
#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。
我还希望在分配给临时对象时收到警告,但那也没有发生。
这是未定义的行为,是我对模板的理解存在缺陷,还是其他原因?
Inside the namespace, there template is only a declaration (not an instantation), so there's no data to mutate inside of the namespace.
不是这样!
[C++14: 14.7.2/6]:
An explicit instantiation of a class, function template, or variable template specialization is placed in the namespace in which the template is defined. [..]
当您有一个 class 模板 Foo
,并引用一个实例化(例如,Foo<int>
)时,该实例化就像正常的 class 一样存在,具有与模板具有相同的范围。
变量模板没有什么不同。当您引用 example::variable_template<int>
时,您 "add" 该变量指向包含模板的范围。
您的命名空间 example
然后包含一个名为 variable_template<int>
的变量。
I would have also expected a warning on the assignment to a temporary, but that didn't happen either.
除了 T(42)
.
之外,这里没有临时对象
今天,有人向我提供了以下形式的代码:
#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。
我还希望在分配给临时对象时收到警告,但那也没有发生。
这是未定义的行为,是我对模板的理解存在缺陷,还是其他原因?
Inside the namespace, there template is only a declaration (not an instantation), so there's no data to mutate inside of the namespace.
不是这样!
[C++14: 14.7.2/6]:
An explicit instantiation of a class, function template, or variable template specialization is placed in the namespace in which the template is defined. [..]
当您有一个 class 模板 Foo
,并引用一个实例化(例如,Foo<int>
)时,该实例化就像正常的 class 一样存在,具有与模板具有相同的范围。
变量模板没有什么不同。当您引用 example::variable_template<int>
时,您 "add" 该变量指向包含模板的范围。
您的命名空间 example
然后包含一个名为 variable_template<int>
的变量。
I would have also expected a warning on the assignment to a temporary, but that didn't happen either.
除了 T(42)
.