编译器错误 C2891

“parameter”: 无法获取模板参数的地址

除非模板参数是一个值,否则无法获取模板参数的地址。 类型参数没有地址,因此不是 lvalue。 模板参数列表中不是 lvalue 且没有地址的非类型值。 这是导致编译器错误 C2891 的代码示例,因为作为模板参数传递的值是模板参数的编译器生成的副本。

template <int i> int* f() { return &i; }

可以获取作为 lvalue(如引用类型)的模板参数的地址。

template <int& r> int* f() { return &r; }

若要更正此错误,请不要获取模板参数的地址,除非它是 lvalue。