C++11 功能列表
Visual Studio 2010 中的 Visual C++ 实现了 C++11 核心语言规范中的多种功能,并且 Visual Studio 2012 中的 Visual C++ 添加了更多 C++11 功能。 Visual Studio 2013 中的 Visual C++ 进一步扩展了此覆盖范围,并且还支持一些精选的 C++14 库功能。 下表列出了 C++11 核心语言功能及其在 Visual Studio 2010、Visual Studio 2012 中的 Visual C++ 和 Visual Studio 2013 中的 Visual C++ 中的 Visual C++ 中的实现状态。
C++11 核心语言功能表
Visual Studio 2010 | Visual Studio 2012 | Visual Studio 2013 | |
---|---|---|---|
2.0 版 | 2.1* 版 | 2.1* 版 | |
否 | 否 | 否 | |
否 | 否 | ||
否 | 否 | ||
否 | 否 | ||
是 | 是 | 是 | |
1.0 版 | v1.0 | 1.0 版 | |
是 | 是 | 是 | |
1.0 版 | 1.1 版 | 1.1 版 | |
v1.0 | 1.1** 版 | 1.1 版 | |
是 | 是 | 是 | |
否 | 否 | 是 | |
否 | 否 | 否 | |
否 | 否 | ||
是 | 是 | 是 | |
是 | 是 | 是 | |
Partial | 是 | 是 | |
否 | 是 | 是 | |
否 | 否 | 否 | |
否 | 否 | 否 | |
TR1 | Partial | Partial | |
否 | 否 | ||
否 | 否 | 否 | |
否 | 否 | 是 | |
否 | 否 | 否 | |
否 | 否 | 否 | |
否 | 否 | ||
否 | 否 | 否 | |
否 | 否 | 否 | |
否 | 是 | 是 | |
否 | 否 | ||
是 | 是 | 是 | |
否 | 否 | 否 | |
否 | 否 | 否 | |
否 | 否 | 否 | |
是 | 是 | 是 | |
否 | 是 | 是 | |
Partial | 是 | 是 | |
是 | 是 | 是 | |
否 | 否 | 否 |
C++11 核心语言功能表:并发
C++11 核心语言功能:并发 | Visual Studio 2010 | Visual Studio 2012 | Visual Studio 2013 |
---|---|---|---|
不可用 | 不可用 | 不可用 | |
否 | 是 | 是 | |
否 | 是 | 是 | |
否 | 是 | 是 | |
不可用 | 不可用 | 不可用 | |
否 | 是 | 是 | |
否 | 否 | 否 | |
是 | 是 | 是 | |
否 | 否 | 否 | |
否 | 否 | 否 | |
Partial | Partial | Partial | |
否 | 否 | 否 |
C++11 核心语言功能:C99
C++11 核心语言功能:C99 | Visual Studio 2010 | Visual Studio 2012 | Visual Studio 2013 |
---|---|---|---|
Partial | Partial | Partial | |
Partial | Partial | Partial | |
是 | 是 | 是 | |
不可用 | 不可用 | 不可用 |
右值引用
说明 |
---|
以下描述中使用的版本标识符(0.1 版、1.0 版、2.0 版、2.1 版、3.0 版)仅用来演示 C++11 的发展。 标准本身不会使用它们。 |
N1610“通过右值澄清类对象的初始化”是早期在不引用右值的情况下支持移动语义的一种尝试。为方便讨论,我们称之为“右值引用 0.1 版”。 它由“右值引用 1.0 版”取代。“右值引用 2.0 版”是 Visual Studio 2010 中的 Visual C++ 功能的基础,它禁止将右值引用绑定到左值,因此可以解决主要的安全性问题。“右值引用 2.1 版”重新定义了此规则。让我们看一下 vector<string>::push_back(),它具有重载 push_back(const string&) 和 push_back(string&&) 以及调用 v.push_back("strval")。表达式 "strval" 是字符串,并且是左值。(其他文本为右值,如整数 1729,但字符串有些特殊,因为它们是数组。)“右值引用 2.0 版”规则显示,string&& 无法绑定到 "strval",因为 "strval" 是左值,因此 push_back(const string&) 是唯一可行的重载。这将创建一个临时 std::string,并将它复制到向量中,然后销毁效率不太高的临时 std::string。 “右值引用 2.1 版”规则确认,将 string&& 绑定到 "strval" 将创建临时 std::string,并且该临时字符串为右值。因此,push_back(const string&) 和 push_back(string&&) 都是可行的,但首选 push_back(string&&)。将构造一个临时 std::string,然后将它移至向量中。这样效率更高。
“右值引用 3.0 版”将添加新规则,以在特定条件下自动生成移动构造函数和移动赋值运算符。 但由于时间和资源限制,这未在 Visual Studio 2013 中的 Visual C++ 中实现。