【发布时间】:2015-04-09 12:36:59
【问题描述】:
我试图通过以下示例了解变量模板的工作原理:
#include <iostream>
template <class T, const T& t>
int var = t.a;
struct T
{
int a;
constexpr T(): a(31){ }
};
T y;
const T t = y;
const T tt = T();
int main()
{
std::cout << "var <T, t> = " << var<T, t> << std::endl; //0
std::cout << "y.a = " << y.a << std::endl; //31
std::cout <<"var <T, tt> = " << var<T, tt> << std::endl; //31
}
老实说,我真的不知道这种行为。让我感到困惑的是,专业化 var<T, t> 是 0,但 y.a 是 31。此外,如果我们用临时初始化 T 类型的对象,我们也会得到不同的结果。你能澄清一下吗?
我的意思是,我正在从工作草案 N4296 中寻找规范性参考,描述该行为。
【问题讨论】:
-
我的猜测是你的程序有未定义的行为。尝试将
y、t和tt声明为constexpr。 -
@AndyProwl 我也有同样的想法,但不幸的是我还没有找到一个规范的参考资料来描述它。
-
@AndyProwl BTW,g++ 甚至不接受该代码。 coliru.stacked-crooked.com/a/1bb8991786ca48b5
-
@DmitryFucintv: GCC only supports variable templates in v5.
-
@Cornstalks 这说明了一切,谢谢。