C ++ 17标准说:
非类型模板参数的模板参数应为a 转换常数表达式......
,而
常量表达式的值不得为
的地址
- 字符串文字
- 一个子对象
- 其他一些例外......
根据我的理解,字符串文字例外背后的基本原理是,根据实现,可能是不同翻译单元中A<"abc">
的出现可能导致不同的实例化(因为字符串文字具有内部链接),或者可能是字符串文字的地址是在链接时定义的(因为字符串文字存储在一些特殊的只读存储器中)。
第一个问题是,如果我对字符串文字例外背后的理由是正确的吗?
第二个问题是:具有静态存储持续时间的对象的子对象例外背后的基本原理是什么?我怀疑问题可能是对齐的,但是对齐是在编译时完成的吗?
答案 0 :(得分:0)
基本思想是,受损的名称将包含其地址被采用的符号的名称。字符串文字没有这样的符号,因此您必须包含文字本身。能够指定子对象同样要求修改包括(可能有几个)消除歧义的类型名称:
struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {} d;
template<A*> struct X;
void f(X<(A*)(B*)&d>*);
与往常一样,该标准避免承认存在诸如重整之类的事情,但它受到它们的强烈推动。