【发布时间】:2021-01-28 22:49:18
【问题描述】:
当我尝试重构SGI STL源代码时,我看到了这段代码sn-p
template <class _Func, class _Ret>
struct _STL_GENERATOR_ERROR {
static _Ret __generator_requirement_violation(_Func& __f) {
return __f();
}
};
template <class _Func>
struct _STL_GENERATOR_ERROR<_Func, void> {
static void __generator_requirement_violation(_Func& __f) {
return __f();
}
};
用于检查相关函数签名类型的有效性。
这是我的问题: 为什么 SGI 故意将 void 的情况特化为返回类型?
template <class _Func, class _Ret>
struct _STL_GENERATOR_ERROR {
static _Ret __generator_requirement_violation (_Func& __f) {
return __f();
}
};
void hello() {}
int main(int argc, char const *argv[])
{
void (*ptr)() = &hello;
_STL_GENERATOR_ERROR<void(*)(), void>::__generator_requirement_violation(ptr);
return 0;
}
我的测试代码可以正常通过编译(clang/llvm/x86_64),并正常运行。
如果我在理解被剪断的原始代码或测试用例设计上犯了错误,请随时指出!
非常感谢。
问题已解决,但 跟进:为什么我的测试用例可以处理返回void类型的情况?
【问题讨论】:
-
您询问的部分专业化是否实际使用
return __f();或__f();?似乎return __f();会使显式部分特化对通用实现变得多余(它们似乎与我相同)。 -
@FrançoisAndrieux 源代码使用
return __f()用于非无效返回的情况(__f() 是非无效返回),并简单地调用__f()用于无效的情况-返回,但我想弄清楚的是,即使我使用return __f()来处理返回无效的情况,它仍然可以很好地工作。
标签: c++ templates stl specialization sgi