在回答this SO question,我的標準中(已C++ 03,仍然在C++ 11),如果他們是你只能使用地址作爲非類型模板參數形式& id-expression
(加上一些例外)。指針作爲非類型模板參數
但我不能回答爲什麼是這種情況。
14.3.2模板非類型參數[temp.arg.nontype]
模板參數的用於非類型的,非模板的模板參數應是以下之一:
[...]
- 一個常量表達式(5.19),其指定具有靜態存儲>持續時間和外部或內部聯動或與外部或內部聯動,包括功能模板和模板功能的功能的對象的地址艾滋病,但exc除非&可以省略,如果名稱引用一個函數或數組,並且如果相應的模板參數是引用則應該省略;如果相應的模板參數是引用,則可以省略該&,除了&可以省略。 [...]
(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
我猜它是與翻譯階段,即編譯器不知道多少關於地址。但是,爲什麼不允許?編譯器是否可以使用類似於宏替換的東西來替換與&foobar
?
非常好的問題。 – 2013-04-08 17:38:54
我想這是一個保守的改變。爲了讓編譯器實現者更容易,C++ 11充滿了真正嚴格的語言工作方式。有可能擴展C++ 11以支持上述內容,但這是C++ 14或更高版本的問題! – Yakk 2013-04-08 17:40:35
[有建議](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4268.html)刪除這些限制。 – dyp 2015-01-01 21:14:56