You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:05:51