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
相关产品推荐
相关产品推荐

