我正在通过cppreference guide来了解概念和约束,这似乎是目前唯一可用的概念和约束。在“原子约束”下,他们给出以下有关相同和不相同约束的示例(进行一些编辑以产生MWE):
template<class T> concept bool Meowable = is_meowable<T>;
template<class T> concept bool BadMeowableCat = is_meowable<T> && is_cat<T>;
template<class T> concept bool GoodMeowableCat = Meowable<T> && is_cat<T>;
template<Meowable T>
void f1(T){ std::cout<<"Called #1\n";} // #1
template<BadMeowableCat T>
void f1(T){ std::cout<<"Called #2\n";} // #2
template<Meowable T>
void f2(T){ std::cout<<"Called #3\n";} // #3
template<GoodMeowableCat T>
void f2(T){ std::cout<<"Called #4\n";} // #4
void g(){
f1(0); // error, ambiguous: the is_meowable<T> in Meowable and BadMeowableCat forms distinct
// atomic constraints that are not identical (and so do not subsume each other)
f2(0); // OK, calls #4, more constrained than #3, GoodMeowableCat got its is_meowable<T> from Meowable
}
但是,当我使用g++ --std="c++1z" -fconcepts
进行编译时,输出为:
Called #2
Called #4
在标准中的某个地方(不是在Concepts TS中,而是在C ++ 20的已采用版本中)指定了此行为(或保留了对规范的定义),如果该指南的确是正确的,那这种限制性规则的依据是什么?我假设概念已标准化为基础constexpr bool
。
预先感谢!
恕我直言,这个问题与this one不同,因为执行的结果与指南和标准显然相抵触,因为对f1的调用应该是模棱两可的,因此会导致编译器错误,但不是,显然#2包含#1。如果不是这种情况,那么我认为有必要澄清这种分歧。