Является ли переменная v
в примере кода ниже odr-used?
extern void* v;
template<void*&>
void f() {}
int main()
{
f<v>();
}
Я нашел этот шаблон в Boost ML.
ср. http://lists.boost.org/Archives/boost/2011/04/180082.php
В нем говорится, что boost::enabler
никогда не определяется, но clang отклоняет его как ошибку привязки, если предоставляется опция -g
.
ср. http://melpon.org/wandbox/permlink/nF45k7un3rFb175z
Пример кода выше - это уменьшенная версия кода Boost ML, а clang тоже отклоняет его.
ср. http://melpon.org/wandbox/permlink/ZwxaygXgUhbi1Cbr
Я думаю (но я не уверен), что аргументы шаблона non-type для ссылочного типа используются odr, даже если они не указаны в их шаблоне, поэтому шаблон Boost ML плохо сформирован.
Правильно ли я понимаю?