1

C++17 标准说:

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

尽管

常量表达式的值不应该是地址

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

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

第一个问题是我对字符串文字例外背后的基本原理的理解是否正确?

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

4

1 回答 1

0

基本思想是,被修改的名称将包括正在获取其地址的符号(名称)。字符串文字没有这样的符号,因此您必须包含文字本身。能够指定子对象同样需要修改包括(可能有几个)消除歧义的类型名称:

struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {} d;

template<A*> struct X;
void f(X<(A*)(B*)&d>*);

像往常一样,该标准避免承认诸如 mangling 之类的东西的存在,但它受到它们的强烈驱动。

于 2017-09-18T07:08:00.497 回答