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