LLVM 项目博客

LLVM 项目新闻和来自一线的详细信息

Clang 对 C++11 及更高版本的支持

截至 r179861,Clang 已实现 C++11 语言标准的全部内容。自 Clang 3.2 发布以来,我们已实现以下功能,并介绍了我们对“C++1y”的计划。


支持[[attributes]]

C++11 的[[attribute]]语法现在已完全支持,包括对标准[[noreturn]][[carries_dependency]]属性的支持(尽管[[carries_dependency]]不提供改进的代码生成)。这允许使用标准语法编写不返回的函数

[[noreturn]] void foo() {
while (true) do_something();
}

就像__attribute__((noreturn))一样,如果在可以返回的函数上使用此属性,Clang 会发出警告,并且会根据函数不返回的假设优化调用者。与__attribute__((noreturn)), [[noreturn]]永远不是函数类型的一部分。

与 g++ 的实现一样,__attribute__((foo))g++ 支持的属性可以写成[[gnu::foo]]。Clang 特定的__attribute__((...))不可以通过此语法使用(添加[[clang::...]]属性名的补丁受欢迎)。

Clang 现在还为 C++11 的近似属性提供了完整的支持alignas(...).

继承构造函数

Clang 现在支持 C++11 的继承构造函数语法,该语法提供了一种简单的机制,可以重新导出基类中的所有构造函数,除了默认构造函数或将成为基类或派生类的复制或移动构造函数的构造函数。示例

struct Base {
Base(); // default constructor, not inherited
Base(int, char);
template<typename T> Base(T &x);
};
struct Derived : Base {
using Base::Base;
};
Derived f(1, 'x');
Derived d("foo"); // ok, calls inheriting constructor template

thread_local变量

Clang 现在支持 C++11 的thread_local关键字,包括线程局部对象的动态初始化和销毁。动态销毁需要提供__cxa_thread_atexit的 C++ 运行时库,该库目前仅由 g++4.8 C++ 运行时库提供。

C++1y

随着 C++11 的发布,接下来会发生什么?C++ 标准化委员会昨天投票决定创建 C++1y(很可能为 C++14)的第一个委员会草案。由于这仅仅是第一个草案,在 C++1y 完成之前可能会有很多小的变化,但粗略的功能集不太可能发生太大变化。这个新的语言标准包括
  • 泛型 lambda,允许模板化的调用运算符和任意捕获

    auto apply = [v(21)] (auto &&fn) { fn(v); };
    apply([] (int &n) { n += 21; });
    apply([] (int n) { std::cout << n; });

  • (非 lambda) 函数的返回类型推导

    auto fn(int n) { return something(n); }

  • 更强大的constexpr功能,允许变量变异和循环

    constexpr auto len(const char *str) {
    int k = 0;
    while (*str++) ++k;
    return k;
    }
    static_assert(len("foo") == 3, "hooray");
改进的constexpr功能带来了向后兼容性的代价。为了支持用户定义类型的变量变异,这些类型需要具有constexpr成员函数,这些函数不是const,因此使constexpr成员函数隐式地const的 C++11 规则已删除。这意味着您需要使const显式,如果您以前依赖此简写。重写

struct S {
int n;
constexpr int get() { return n; }
};

... 为 ...
struct S {
int n;
constexpr int get() const { return n; }
};

...,您的代码将在 C++11 和 C++14 中都能正常工作。Clang 已经针对依赖于隐式const规则的代码发出警告,如果运行clang -fixit,Clang 会为您修复它。其他支持 C++11 的编译器constexpr预计很快就会开始提供类似的警告。

Clang 在标准化之前对许多新功能进行了原型设计,我们预计这些功能的实现将在未来几周内发布到 Clang SVN 中。有关 C++1y 功能和 Clang 对它们的最新支持信息,请查看 Clang C++ 状态页面。已实现的功能可以使用-std=c++1y命令行标志启用。

如果您在 C++11 支持中发现错误,请在 我们的错误跟踪器 上报告它们。如果您想参与修复错误或进行 C++1y 支持工作,我们的网站 上有详细说明您如何提供帮助。