在KlayGE首次引入C++11特性之后,我顺便调研了一下个主流编译器对C++11的支持度,以便在下个版本中加入更多的C++11元素。这里还列出了在不支持的时候,可以采用的替代方案。主要参考了C++11 Features in Visual C++ 11,Status of Experimental C++0x Support in GCC 4.6,Status of Experimental C++0x Support in GCC 4.7,Boost。
C++11 Core Language Features
|
VC 10 |
VC 11 |
GCC 4.6 |
GCC 4.7 |
替代方案 |
Rvalue references |
Yes |
Yes |
Yes |
Yes |
Boost.Move |
Rvalue references for *this |
No |
No |
No |
No |
|
Non-static data member initializers |
No |
No |
No |
Yes |
|
Variadic templates |
No |
No |
Yes |
Yes |
|
Initializer lists |
No |
No |
Yes |
Yes |
|
static_assert |
Yes |
Yes |
Yes |
Yes |
Boost.Static Assert |
auto |
Yes |
Yes |
Yes |
Yes |
Boost.Typeof |
Trailing return types |
Yes |
Yes |
Yes |
Yes |
Boost.ReturnType |
Lambdas |
Yes |
Yes |
Yes |
Yes |
Boost.Lambda |
decltype |
Yes |
Yes |
Yes |
Yes |
Boost.Typeof |
Right angle brackets |
Yes |
Yes |
Yes |
Yes |
TR1 |
Default template arguments for function templates |
No |
No |
Yes |
Yes |
|
Expression SFINAE |
No |
No |
Yes |
Yes |
|
Alias templates |
No |
No |
No |
Yes |
|
Extern templates |
Yes |
Yes |
Yes |
Yes |
|
nullptr |
Yes |
Yes |
Yes |
Yes |
自己实现的null_ptr |
Strongly typed enums |
No |
Yes |
Yes |
Yes |
#define |
Forward declared enums |
No |
Yes |
Yes |
Yes |
|
Attributes |
No |
No |
No |
No |
|
constexpr |
No |
No |
Yes |
Yes |
|
Alignment |
No |
No |
No |
No |
|
Delegating constructors |
No |
No |
No |
Yes |
|
Inheriting constructors |
No |
No |
No |
No |
|
Explicit conversion operators |
No |
No |
Yes |
Yes |
|
char16_t and char32_t |
No |
No |
Yes |
Yes |
|
Unicode string literals |
No |
No |
Yes |
Yes |
|
Raw string literals |
No |
No |
Yes |
Yes |
|
Universal character names in literals |
No |
No |
Yes |
Yes |
|
User-defined literals |
No |
No |
No |
Yes |
|
Standard-layout and trivial types |
No |
Yes |
Yes |
Yes |
|
Defaulted and deleted functions |
No |
No |
Yes |
Yes |
|
Extended friend declarations |
Yes |
Yes |
No |
Yes |
|
Extended sizeof |
No |
No |
No |
Yes |
|
Inline namespaces |
No |
No |
Yes |
Yes |
|
Unrestricted unions |
No |
No |
Yes |
Yes |
|
Local and unnamed types as template arguments |
Yes |
Yes |
Yes |
Yes |
|
Range-based for-loop |
No |
Yes |
Yes |
Yes |
Boost.Foreach |
override and final |
No |
Yes |
No |
Yes |
#define |
Minimal GC support |
Yes |
Yes |
No |
No |
|
noexcept |
No |
No |
Yes |
Yes |
|
C++11 Core Language Features: Concurrency
|
VC 10 |
VC 11 |
GCC 4.6 |
GCC 4.7 |
替代方案 |
Reworded sequence points |
No |
No |
No |
No |
|
Atomics |
No |
Yes |
No |
Yes |
Boost.Atomic |
Strong compare and exchange |
No |
Yes |
No |
No |
|
Bidirectional fences |
No |
Yes |
No |
No |
|
Memory model |
No |
No |
No |
No |
|
Data-dependency ordering |
No |
Yes |
No |
No |
|
Data-dependency ordering: function annotation |
No |
No |
No |
No |
|
exception_ptr |
Yes |
Yes |
Yes |
Yes |
Boost.Exception |
quick_exit and at_quick_exit |
No |
No |
No |
No |
|
Atomics in signal handlers |
No |
No |
No |
No |
|
Thread-local storage |
No |
No |
No |
No |
Boost.Thread |
Magic statics |
No |
No |
No |
No |
|
C++11 Core Language Features: C99
|
VC 10 |
VC 11 |
GCC 4.6 |
GCC 4.7 |
替代方案 |
__func__ |
No |
No |
Yes |
Yes |
__FUNCTION__ |
C99 preprocessor |
No |
No |
Yes |
Yes |
|
long long |
Yes |
Yes |
Yes |
Yes |
__int64 |
Extended integer types |
No |
No |
No |
No |
|
C++11 Library
|
VC 10 |
VC 11 |
GCC 4.6 |
GCC 4.7 |
替代方案 |
shared_ptr, weak_ptr |
Yes |
Yes |
Yes |
Yes |
Boost.SmartPtr |
make_/allocate_shared, owner_before |
Yes |
Yes |
Yes |
Yes |
Boost.SmartPtr |
unique_ptr |
Yes |
Yes |
Yes |
Yes |
Boost.Interprocess |
Fixed-Size Arrays |
Yes |
Yes |
Yes |
Yes |
Boost.Arrays |
Hash Tables |
Yes |
Yes |
Yes |
Yes |
Boost.Unordered |
Singly-linked list |
Yes |
Yes |
Yes |
Yes |
Boost.Container |
Regular Expressions |
Yes |
Yes |
Yes |
Yes |
Boost.Regex |
Tuple |
Yes |
Yes |
Yes |
Yes |
Boost.Tuple |
Random Numbers & Distributions |
Yes |
Yes |
Yes |
Yes |
Boost.Random |
Type Traits |
Yes |
Yes |
Yes |
Yes |
Boost.TypeTraits |
Generalized Function Pointers |
Yes |
Yes |
Yes |
Yes |
Boost.Function |
Generalized Binders |
Yes |
Yes |
Yes |
Yes |
Boost.Bind |
Generalized Member Function Adapters |
Yes |
Yes |
Yes |
Yes |
Boost.Bind |
Reference Wrappers |
Yes |
Yes |
Yes |
Yes |
Boost.Ref |
Return type calculation |
Yes |
Yes |
Yes |
Yes |
Boost.ReturnType |
New algorithms |
Yes |
Yes |
Yes |
Yes |
Boost.Algorithm |
Time |
No |
No |
Yes |
Yes |
Boost.Chrono |
其中,斜体的Yes表示VC 11和GCC 4.7都支持,同时还有非C++11的替代方案,所以很可能在下一版本的KlayGE中使用到。从上面的表可以看出,Library的支持度相当好。即使编译器不支持,也可以很容易地用Boost替换掉。语言核心则还远不到完美,但最常用的基本都已经涵盖了。有些feature,比如foreach和auto,用Boost在库级别支持,对编译速度有很大影响。换用C++11在核心语言级别支持的话应该有较大幅度的编译性能提升。