在回答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/