调用概念受限的模板函数的模棱两可

时间:2018-12-27 08:13:44

标签: c++ g++ c++-concepts c++20

我正在通过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。如果不是这种情况,那么我认为有必要澄清这种分歧。

0 个答案:

没有答案