C++模板返回类型自动推导失败,为何无法推导返回模板参数?
模板函数返回值类型无法自动推导的原因
问题场景
先看核心问题对应的简化代码:
模板定义
template <typename B, typename A> B func(A x) {/* 逻辑实现 */}
调用代码
uint32_t a[6] = {1,2,3,4,5,6}; uint64_t b = func(a);
编译报错
test.cxx:10:16: error: no matching function for call to 'func' uint64_t b = func(a); ^~~~~~~~~ test.cxx:5:6: note: candidate template ignored: couldn't infer template argument 'B'
实际使用的是用于位切片的bit_slice函数,完整代码如下:
template <typename B, typename A> B bit_slice(A words[], int start, int end) { int wordSize = sizeof(A)*8; B s = 0; int n = end / wordSize; for(int i= 0; i <= n; ++i){ s = (s << wordSize) + words[i]; } s >>= (n+1) * wordSize - (end+1); B mask = (((B)1) << (end - start + 1)) - 1; // 注:原代码中T为笔误,修正为B s &= mask; return s; };
为什么编译器推不出B?
模板推导只看函数实参
C++的模板参数推导逻辑是仅从函数调用时传入的实参来反推模板参数。这里B是返回值类型,它并没有出现在函数的参数列表里——传入的实参只有数组a(对应A)、start和end(都是int),没有任何实参能让编译器关联到B的类型。推导阶段早于赋值类型检查
虽然返回值最终要赋值给uint64_t类型的b,但模板参数推导是在编译的早期阶段完成的,此时编译器还未处理到“将返回值赋值给b”这一步的类型校验,自然没法利用这个赋值目标的类型来推导B。推导独立于上下文
模板参数推导是孤立进行的,它只分析函数调用本身的信息,不会去调用语句之外的上下文(比如赋值目标变量的类型)中寻找推导依据。
补充说明
你提到的显式指定模板参数的写法,正确的语法应该是func<uint64_t>(a)(原写法<uint64_t>func(a)不符合C++语法),通过显式指定B的类型,编译器就能顺利推导出A并实例化模板。
内容的提问来源于stack exchange,提问作者Limone
相关产品推荐
相关产品推荐

