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

C++20中模板参数约束依赖其他参数是否合法?

问题

在以下代码片段中:

template<typename T, int val>
concept hasValue = (T::value == val);

// 对`wrapper`参数的约束依赖于`val`
template<int val, hasValue<val> auto wrapper>
struct X {};

struct X的wrapper模板参数的类型必须满足依赖于另一模板参数val的concept hasValue<val>。根据C++20标准,该程序是否合法?是否格式错误?还是标准未明确说明?

注意: 这是一个严格的语言律师问题,我不需要变通方案(一个简单的方案是在模板参数后使用requires子句)。


C++20标准

我无法获取官方标准。查看最新的公开C++20草案,我认为(temp.constr.decl)是相关章节。但根据我对该文档的有限理解,尚未找到问题的答案。

编译器对比

使用以下代码片段:

template<typename T, int val>
concept hasValue = (T::value == val);

template<int val>
struct ValueWrapper {
    static constexpr int value = val;
};

template<int val, hasValue<val> auto wrapper>
struct X {};

struct Y {
    static constexpr ValueWrapper<2> wrapper2{};
    static constexpr X<2,wrapper2> x{};
};

在在线编译器测试中:

  • gcc-12.2 和 clang-15 无警告地接受该代码,即使开启-Wall -Wextra -Wpedantic。
  • MSVC v19.33 拒绝编译,在Y::x的声明处报错:error C7601: the associated constraints are not satisfied。编译器本身可以接受struct X的声明,但在声明Y::x时将concept评估为false。我在其bug追踪器中未找到相关工单。编辑: 我提交了一个新报告。

我不知道gcc和clang是超出标准要求的宽松处理,还是这是MSVC的bug。


编辑记录
  • 2023-03-20:针对该问题提交的MSVC bug报告被标记为“内部修复 - 待发布”。
  • 2023-08-09:bug报告关闭。Visual Studio 17.7.0(即MSVC v19.37.32822)现在可以接受该代码。

内容的提问来源于stack exchange,提问作者Vincent Saulue-Laborde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:13:37