C ++ 14-способ определения глобальной константы x
какого-то типа X
является:
struct X { int i; char c; };
template< typename = void >
X const x_impl{1, 'x'};
static X const & x = x_impl<>;
Техника позволяет избежать ODR-нарушения (из-за внешней привязки шаблонов переменных).
Но для шаблонов функций есть удобная возможность опустить угловые скобки в следующих случаях:
template< typename T >
void f(T) {}
template< typename T = void >
void g() {}
// ...
f< int >(1);
f<>(1);
f(2); // also valid
g<>();
g(); // also valid
Существуют ли теоретические причины для отказа в возможности ссылаться на шаблон переменной без списка аргументов шаблона, даже если все (не типовые) параметры шаблона имеют значения по умолчанию (значения)? Будет очень удобно иметь возможность определять глобальные константы (скажем, в библиотеке только для заголовков) в такой форме:
template< int = 0 >
A const a{1, 'a'};
а затем, чтобы иметь возможность ссылаться на a
без каких-либо угловых скобок.
std::cout << &a << std::endl; // odr-using
Задача ещё не решена.
Других решений пока нет …