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<>;
The technique允许我们避免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