(序言:我是 C++0x 游戏的后期追随者,最近关于从 C++0x 标准中删除概念的争议促使我更多地了解它们。虽然我明白我所有的问题都是完全假设的——只要概念在未来一段时间内都不是有效的 C++ 代码,如果有的话——我仍然有兴趣了解更多关于概念的知识,特别是考虑到它如何帮助我更全面地理解最近决定背后的优点以及随之而来的争议)
在阅读了一些关于 C++0x (直到最近)提出的概念的介绍性材料之后,我无法将我的思想集中在一些句法问题上。事不宜迟,以下是我的问题:
1) 支持特定派生概念的类型(隐式地,通过 auto 关键字,或显式地通过 concept_maps)是否也需要独立地支持基本概念?换句话说,从另一个概念(例如concept B<typename T> : A<T>
)推导出一个概念的行为是否隐含地包含一个“不可见的”需求语句(在 B 内requires A<T>;
)?混淆来自关于概念的维基百科页面,该页面指出:
与类继承一样,满足派生概念要求的类型也满足基概念要求。
这似乎是说一个类型只需要满足派生概念的要求,而不必满足基本概念的要求,这对我来说毫无意义。我知道维基百科远不是一个确定的来源;上面的描述只是一个糟糕的选择吗?
2)列出类型名的概念可以是“自动”吗?如果是这样,编译器将如何自动映射这些类型名?如果不是,在其他情况下在概念上使用“自动”是无效的吗?
为了澄清,请考虑以下假设代码:
template<typename Type>
class Dummy {};
class Dummy2 { public: typedef int Type; };
auto concept SomeType<typename T>
{
typename Type;
}
template<typename T> requires SomeType<T>
void function(T t)
{}
int main()
{
function(Dummy<int>()); //would this match SomeType?
function(Dummy2()); //how about this?
return 0;
}
这些类中的任何一个都与 SomeType 匹配吗?或者对于涉及类型名的概念是否需要一个概念映射?
3)最后,我很难理解允许定义什么公理。例如,我能否有一个概念定义一个逻辑上不一致的公理,例如
concept SomeConcept<typename T>
{
T operator*(T&, int);
axiom Inconsistency(T a)
{
a * 1 == a * 2;
}
}
那会做什么?这甚至有效吗?
我很感激这是一组很长的问题,所以我提前感谢你。