Нетипичный ссылочный параметр / аргумент
Почему аргумент шаблона ссылки не-типа не может быть другой ссылкой (g ++ 4.8.1):
template <int& N> void test() { }
int x = 5;
int& p = x;
int main(){
test<x>(); //compiles fine
test<p>(); //error: could not convert template argument 'p' to 'int&'|
}
Я не вижу, где из стандартаp
нарушает что-либо, эти разделы казались наиболее актуальными (N3337):
[14.3.2] [.1] Шаблонный аргумент для нетипового, нешаблонного шаблона-параметра должен быть одним из:
- для нетипового шаблона-параметра целочисленного или перечислимого типа преобразованное константное выражение (5.19) типа шаблона-параметра; или же
- имя нетипового шаблона-параметра; или же
- константное выражение (5.19), которое обозначает адрес объекта со статической продолжительностью хранения и внешней или внутренней связью или функцию с внешней или внутренней связью, включая шаблоны функций и идентификаторы шаблонов функций, но исключая нестатические члены класса, выраженную ( игнорируя круглые скобки) как & id-выражение, за исключением того, что & может быть опущено, если имя относится к функции или массиву, и должно быть опущено, если соответствующий параметр шаблона является ссылкой; или же .....
[0,4]
[Примечание. Временные значения, неназванные lvalues и именованные lvalues без связи не являются допустимыми аргументами шаблона, когда соответствующий параметр шаблона имеет ссылочный тип.
[0,5]
- Для нетипового шаблона-параметра типа ссылка на объект преобразования не применяются. Тип, на который ссылается ссылка, может быть более квалифицированным по cv, чем (иначе идентичный) тип шаблонного аргумента. Параметр шаблона связан непосредственно с аргументом шаблона, который должен быть lvalue.
p
следует считать lvalue не так ли? Единственное, о чем я мог подумать, это, возможно, отсутствие связи для ссылок, но добавлениеextern int& p = x
не исправить это тоже.