C++ 关于模板专业化和命名空间限定的规则是什么?我有一些代码可以归结为以下内容,这让我意识到我不了解 C++ 关于模板专业化初始化的规则。首先对我来说似乎很奇怪,g::F<>
甚至允许内部的专业化h
,但鉴于此,我不知道为什么事情会以他们的方式行事。
namespace g {
struct N {
N(char c):c_(c){}
char c_;
};
template <typename V>
struct F {
static N n_s; // <-- want to initialize these for specializations
};
namespace h {
struct X { static constexpr char k{'x'}; };
template <> N F<char>::n_s{h::X::k}; // OK
template <> N F<int>::n_s{X::k}; // fails on "‘X’ not declared"
}
} // namespace g
// Seems weirdest to me. N and F need full qualifications but X doesn't.
template <> g::N g::F<float>::n_s{h::X::k}; // OK also!
最后一个实例化/初始化,其中模板静态成员初始化器推断g
命名空间,使模板看起来好像初始化器在代码中与模板定义本身位于同一位置。
规范这种行为的规则是什么?(请注意,这是在 gcc 4.8.1 上测试的,到目前为止看起来有点像一个错误......)