【发布时间】:2020-06-19 21:53:04
【问题描述】:
template< typename _Type >
struct TypeChecker {};
template< typename _Type >
bool f0( _Type obj )
{
return TypeChecker< _Type >::value;
}
struct S {};
void f1()
{
f0( S{} );
}
template<>
struct TypeChecker< S > : std::true_type {};
显然“TypeChecker : std::true_type” 在定义 f1() 时是未知的,但是 MSVC2019 和 Clang 都编译它没有错误。
我不确定这是否是标准的保证行为。
我在 SO 中发现了一些类似的问题: When is a C++ template instantiation type checked? Incomplete class usage in template Can the point-of-instantiation be delayed until the end of the translation unit?
我相信这是规范中的相关部分:
函数模板、成员函数模板或类模板的成员函数或静态数据成员的特化可以在翻译单元内具有多个实例化点,并且除了上述实例化点之外,对于在翻译单元内具有实例化点的任何此类特化,翻译单元的末尾也被视为实例化点。
但是“翻译单元的结尾也被认为是一个实例化点”到底是什么意思呢? 这是否意味着它依赖于实现?就像“编译器A”编译上面的代码没有错误而“编译器B”没有,而两者都符合标准?
或者任何标准 c++ 编译器都保证这段代码格式正确?
【问题讨论】:
标签: c++ templates language-lawyer