考虑以下代码:
#include <type_traits>
template <typename T> struct A
{
static_assert(!std::is_same_v<int, T>);
};
template<typename T> struct B
{
void foo()
{
A<int>{};
}
};
int main() {}
它来自俄罗斯StackOverflow上的this question,它询问它是否有效 .
我试图引用这个:
[temp.res] /8.1 8可以在任何实例化之前检查模板的有效性 . [注意:知道哪些名称是类型名称允许以这种方式检查每个模板的语法 . - 结束注释]如果出现以下情况,则程序格式错误,无需诊断:(8.1) - 无法为模板或模板中的constexpr if语句生成有效的特殊化,并且模板未实例化,或者 . ..
(强调我的)
由于无法为 foo()
生成有效的专业化,因此我推断该片段格式不正确,NDR .
但我被告知 [temp.res]/8.1
不适用,因为 foo()
本身不是模板成员函数 .
cppreference调用模板类"templated entities"的非模板成员函数,但似乎不清楚它们是否可以被视为模板本身 .
因此,问题是:标准是否将模板类的非模板成员视为“模板”本身?
1 回答
这基本上是CWG issue 1253
它似乎仍在起草中 . 但我认为,就像这个问题一样,OP中的代码也应该是格式错误的NDR . 即使从不使用成员函数(因此它的完整定义永远不会被实例化),它仍然不能被假设地实例化,这将它置于错误[temp.res] / 8的范畴之下 .