bal*_*lki 19 c++ c++-concepts c++17
考虑class A满足两个概念ConceptA和ConceptB.让一个函数foo重载两个概念:
void foo(ConceptA& arg);
void foo(ConceptB& arg);
A a;
fun(concept_cast<ConceptA>(a));
Run Code Online (Sandbox Code Playgroud)
注意:此示例使用作为N3701,§5的一部分提出的"Terse Notation"语法
是否存在concept_cast允许用户选择重载的东西?
例如:可以说,
ConceptA说T有权有一个成员函数bar()
ConceptB说T有权有一个成员函数baz()
,并class A同时具有bar()和baz()成员函数
它显然是模棱两可的,但有没有办法明确选择我们static_cast正常的重载?
更新:已接受的答案超过2年.c ++ 17中的任何更新?
如果其中一个概念是另一个概念的更受约束的版本(例如,满足的所有内容ConceptA也将满足,但反之亦然),则将选择满足ConceptB的最受约束的重载。A
如果两个概念都不比另一个概念受到更多约束,则这两个概念被认为是不明确的重载。鉴于您如何表达这个问题,我希望您已经知道这一点。
关于concept_cast,我认为目前的提案中没有类似的内容。至少从布里斯托尔会议(2013 年 4 月)开始是这样。我不认为这种情况会发生改变,因为当前的重点似乎是确保精简版概念/约束提案的核心是可行的并为委员会所接受。
可能会有一些显式选择像这样的重载模板函数的需求,也许这样的强制转换是正确的,但我不太确定。考虑到这样的强制转换仅对重载消歧有用,而 asstatic_cast是更通用的功能。的结果concept_cast将与重载决策上下文之外的原始值相同!
编辑:查看最新的提案(N3701),没有明确指定要实例化哪个模板函数的规定。