在回答this SO question时,我在标准版(已经为C++ 03,仍在C++ 11中)中发现,如果地址的形式为& id-expression(加上一些异常(exception)),则只能将地址用作非类型模板参数。

但是我无法回答为什么会这样。



(n3485,重点是我的)

例:

using TFoobar = int (*)();
template < TFoobar tp > struct foo_struct{};

int foobar() { return 42; }
constexpr TFoobar pFoobar = &foobar;

foo_struct < &foobar > o0; // fine
foo_struct < pFoobar > o1; // ill-formed

我猜这与翻译阶段有关,即编译器对地址了解不多。但是,为什么不允许呢?编译器是否应该使用类似于宏替换的方法将pFoobar替换为&foobar

最佳答案

考虑类Foo<&X>Foo<&Y>,它们都具有静态成员int Bar。链接器必须能够判断您的程序是1个对象还是2个Bar对象。现在考虑链接器也是最有可能负责将值分配给&X&Y的一方。

再看一下标准。在撰写本文时,编译器无需将实际地址传达给链接程序。相反,它将传递id-expression。链接器已经非常有能力确定两个id-expression是否相同,即使在为它们分配数字地址之前也是如此。

关于c++ - 指针作为非类型模板参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15885399/

10-12 21:41