template <int * ip> struct test {};
struct q {
static int a;
int b;
constexpr q(int b_) : b(b_) {}
};
int i;
constexpr q q0(2);
int main()
{
constexpr test<&i> t1; // Works fine
constexpr test<&q::a> t2; // Works
constexpr test<&q0.b> t3; // Does not work; address of non-static member?
return 0;
}
Объявление t3 в вышеуказанной части кода не выполняется, несмотря на то, что аргумент шаблона &q0.b
известен во время компиляции. Некоторые поисковые роботы показали, что это запрещено стандартом (раздел 14.3.2):
[Примечание. Адреса элементов массива и имен или адресов нестатических членов класса не являются допустимыми шаблонами-аргументами.
X & s.m > x4;//ошибка: адрес нестатического membe
Итак, почему именно это явно запрещено стандартом, несмотря на то, что адреса нестатических членов глобальных переменных являются уникальными, а также известны во время компиляции?