为何C++概念无法用简单要求检查嵌套类型是否存在?
为什么
requires { T::inner; }无法匹配类型别名T::inner? 先看这段无法编译的代码:
template <typename T> concept HasInner = requires { T::inner; }; void foo(HasInner auto x) { return; } struct Test { using inner = int; }; int main() { foo(Test()); }
问题
上述代码为何无法编译?T::inner; 不是有效表达式吗?
我知晓concept HasInner = requires { typename T::inner; }; 是可行的,但想了解第一种写法不可行的原因。
原因解析
核心逻辑很明确:requires表达式的花括号内必须是合法的表达式语句。当T::inner是类型别名(比如using inner = int;)时,它只是一个类型名称,并非表达式——表达式是能生成具体值的代码,类型名本身不能作为独立语句执行,因此T::inner;在这里是非法的。
只有当T::inner是可求值的实体(比如静态数据成员、枚举常量、函数等)时,T::inner才是合法的表达式,此时requires { T::inner; }才能满足概念要求。比如下面的代码就能正常编译:
struct Test { constexpr static int inner = 1; }; int main() { foo(Test()); // 此代码可正常编译 }
内容的提问来源于stack exchange,提问作者youz
相关产品推荐
相关产品推荐

