Не компилируется следующее:
template<void *p>
class X {
// ...
};
int r;
int main()
{
X<&r> x;
return 0;
}
Сообщение об ошибке
x.cc:10:6: ошибка: не удалось преобразовать аргумент шаблона '& r to 'void *
Явное использование casting & r to (void *) тоже не помогает. Сообщение об ошибке становится:
x.cc:10:14: error: невозможно преобразовать аргумент шаблона '(void *) (& r) в' void *
Какая часть стандарта определяет это поведение? Версия GCC версия gcc 5.2.1 20151003 (Ubuntu 5.2.1-21ubuntu2)
Edit:
Обратите внимание, что использование, например, int * вместо void * работает как ожидалось.
Изменить: (отвечает на себя)
Он работает не с gcc HEAD 6.0.0 20151016 (экспериментальный) при указании -std = С++ 1z, ни с неявным, ни с явным литьем в "void *".
Он работает с clang HEAD 3.8.0 (trunk 250513) и был с (по крайней мере) clang 3.6.0 (теги/RELEASE_360/final) при указании --std = С++ 1z и явно приведения к * void * ". Без явного приведения, clang жалуется следующим образом:
x.cc:10:7: ошибка: преобразование из 'int *' в 'void *' недопустимо в преобразованном постоянном выражении
Ответственность за исправление этой ошибки в спецификации языка С++ - N4268, который уже реализуется.