为何derived<base<false>>会满足C++的can_foo概念?
问题解析:为什么
derived<base<false>>会满足can_foo概念 核心原因在于C++概念检查仅验证成员函数的声明存在性,而非定义的合法性,具体拆解如下:
derived的foo函数是无条件声明的
你的derived模板中,foo函数是直接声明的,没有任何约束——不管基类T有没有foo成员,derived都会拥有一个foo()的函数声明。概念can_foo在检测时,只会检查目标类型是否存在可调用的foo()成员,不会去实例化这个函数的定义来验证其内部逻辑是否合法。概念检查与函数实例化的时机差异
- 当你用
can_foo<derived<base<false>>>做检查时,编译器只看derived的类模板签名,确认它有foo()的声明,就判定满足概念。 - 只有当你实际调用
derived<base<false>>::foo()时,编译器才会实例化这个函数的定义,此时才会发现基类base<false>没有foo成员,进而触发编译错误。
- 当你用
添加
can_foo<T>约束的作用
给derived的foo函数加上requires can_foo<T>约束后,编译器会先检查基类T是否满足can_foo:- 如果
T是base<true>,满足约束,derived的foo函数正常声明; - 如果
T是base<false>,不满足约束,derived就不会生成foo函数的声明,此时can_foo<derived<base<false>>>自然就不成立了。
- 如果
内容的提问来源于stack exchange,提问作者rexracerisracerx
相关产品推荐
相关产品推荐

