为什么不允许全局的结构/联合子项作为模板引用参数 - 而是全局变量本身

why are struct/union childs of global not allowed as template reference parameter - but the globals itself?

本文关键字:参数 引用 全局变量 结构 全局 不允许 为什么      更新时间:2023-10-16

我尝试使用模板参数引用全局变量的子元素 - 它确实适用于全局元素,但不适用于全局变量的子元素 - 为什么在编译时无法解析子元素?

typedef unsigned char byte_t;
typedef unsigned short word_t;
struct byte_reg_t
{
     byte_t low;
     byte_t high;
};
union word_reg_t
{
     word_t value;
     byte_reg_t part;
};
word_t rax;
byte_t rah;
word_reg_t r16;
byte_reg_t r8;
template<typename ValueType, ValueType& Ref>
ValueType ret_ref()
{
     return Ref;
}
int main()
{
    word_t x = ret_ref<word_t,rax>();
    byte_t h = ret_ref<byte_t,rah>();
    //word_t sx = ret_ref<word_t,r16.value>(); // compile error
    //byte_t sh = ret_ref<byte_t,r16.part.low>(); // compile error
    //byte_t sh2 = ret_ref<byte_t,r8.low>(); // compile error
    return 0;
} 

VS2010 和 clang 3.1 编译器不允许//编译错误行

感谢任何清晰的描述,因为我没有看到编译器行为的任何技术原因

答案就在C++标准中。很抱歉已经过时了,但我的版本(ISO/IEC 14882,2003 年第 2 版)说(第 246 页):

§14.3.2 模板非类型参数

   [..]

3 [注:数组元素和名称的地址或 非静态类成员的地址是不可接受的模板参数。[..]]