为何C++模板参数推导无法推导出std::array的元素?
问题描述
考虑以下C++20代码:
#include <array> // 依赖int数组的类模板 template<std::size_t N, std::array<int, N> arr> struct S {}; // 固定数组长度(简化代码) template<int x> using U = S<1, std::array{x}>; // 仅依赖数组元素的函数模板 template<int x> auto func(U<x>) {} int main() { func(U<2>{}); // 错误:编译器无法推导x=2 }
为何编译器无法在调用func时推导出x=2?
预期结果
由于std::array可作为模板参数且其比较是constexpr操作,我对这段代码无法编译感到意外,希望了解编译器无法完成这一看似简单的推导的原因。
相关替代方案
以下两种变体可正常编译,但我认为不够理想,希望能避免使用:
方案一
显式指定模板参数,示例如下:
func<2>(U<2>{})
但这种方式不够便捷,存在代码重复问题。
方案二
另一种方案是传递显式模板参数并限制模板,示例如下:
template<std::size_t N, std::array<int, N> arr> auto func(S<N, arr>) requires (N == 1) {}
该方案的缺点是代码过于冗长。
内容的提问来源于stack exchange,提问作者Föxs
相关产品推荐
相关产品推荐

