The fall of C++11 concept

之前提到过 C++ template 出错时提示的令人无法理解的编译错误输出恐怕是当前的 C++ 语言最糟糕的部分。显然 C++ 标准委员会的成员早就明了这点。一年多前曾注意到 C++11 最后放弃了能够解决这一问题的 concept 概念,当时只是感到可惜而已。最近看到的几篇 blog 介绍了更多的因果和细节。

简单介绍下 concept 这个概念。在现在的 C++ (C++03) template 的实现上,并不能明确的表示一个模板函数对于模板类型的要求。比如如下的代码片段,

template
const T& min(const T& x, const T& y) {
    return x < y? x : y;
}

理解代码后可以看到,这个模板函数要求模板类型 T 有 operator < 函数来比较两个 T 的实例。但编译器只有在以某一个确定的 T 类型实例化 min 函数后才能检查出 T 是否支持 operator <。

而 concept 可以在一开始就把这一隐式的要求明确化。如下的代码片段,

auto concept LessThanComparable {
    bool operator<(const T& x, const T& y);
}

template
requires LessThanComparable
const T& min(const T& x, const T& y) {
    return x < y? x : y;
}

前半部分的代码定义了 LessThanComparable 这一 concept,要求只有实现了 operator < 的模板类型才算符合 LessThanComparable。后半部分的代码则声明只有符合 LessThanComparable concept 的类型才能实例化 min 模板函数。如果代码中试图使用不满足 LessThanComparable 的类型来实例化模板函数,编译器会直接在实例化时就给出编译错误,而不是实例化之后。

其实 concept 也不算非常新的概念。Haskell 早就有了类似的 type class 的概念。

然后最近看到的是 Bjarne Stroustrup Expounds on Concepts and the Future of C++ 这篇 blog (2009年的文了),提到了 Stroustrup 对 concept 的见解。部分的想法是在简单但难理解的 template,与明确但复杂的 concept 之间的权衡。理想中,一般程序员应该只需要简单了解 concept 这一基本概念就能完成一般的 template 编程,但在现实中 concept (主要是 concept map)已经相当复杂了。Stroustrup 在 N2906 Simplifying the use of concepts 的文章表达了他对 concept 的复杂性的担忧;To Auto or Not? That is the Question 则是对是否用 auto 来简化这一复杂性的担忧。另一部分的原因则是时间,标准定案的时候,虽然已经经历了数年的设计和实验(包括原型的编译器 ConceptGCC), concept 仍被大多数委员认为 not quite ready。

Advertisements
This entry was posted in Computer and Internet and tagged , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s