模板非类型参数的例外情况

时间:2017-05-04 07:27:38

标签: templates c++17 string-literals non-type subobject

C ++ 17标准说:

  

非类型模板参数的模板参数应为a   转换常数表达式......

,而

  

常量表达式的值不得为   

的地址      
      
  • 字符串文字
  •   
  • 一个子对象
  •   
  • 其他一些例外......
  •   

根据我的理解,字符串文字例外背后的基本原理是,根据实现,可能是不同翻译单元中A<"abc">的出现可能导致不同的实例化(因为字符串文字具有内部链接),或者可能是字符串文字的地址是在链接时定义的(因为字符串文字存储在一些特殊的只读存储器中)。

第一个问题是,如果我对字符串文字例外背后的理由是正确的吗?

第二个问题是:具有静态存储持续时间的对象的子对象例外背后的基本原理是什么?我怀疑问题可能是对齐的,但是对齐是在编译时完成的吗?

1 个答案:

答案 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>*);

与往常一样,该标准避免承认存在诸如重整之类的事情,但它受到它们的强烈推动。