C++11 được ISO phê chuẩn tháng 8/2011. Visual Studio 2015 hỗ trợ hầu hết các tính năng cốt lõi của C++11.
Các tính năng chính
1. nullptr - Con trỏ null kiểu an toàn
// Cũ: NULL hoặc 0 - có thể chuyển ngầm sang int int* p1 = NULL; int* p2 = 0; // Mới: nullptr_t - không chuyển ngầm sang integral int* p3 = nullptr; void func(int); void func(int*); func(nullptr); // Gọi overload int* chắc chắn
2. Lambda expressions (Biểu thức lambda)
// Lambda cơ bản
auto add = [](int a, int b) { return a + b; };
cout << add(3, 4); // 7
// Capture bằng giá trị/tham chiếu
int x = 10;
auto captureValue = [x]() { return x; }; // x = 10
auto captureRef = [&x]() { return x; }; // tham chiếu x
x = 20;
cout << captureValue() << " " << captureRef(); // 10 20
// Generic lambda (C++14)
auto generic = [](auto a, auto b) { return a + b; };
3. auto - Deduction kiểu tự động
auto x = 42; // int auto y = 3.14; // double auto ptr = new int(10); // int* auto& ref = x; // int& const auto& cref = x; // const int& // Với container - rất hữu ích std::vectorv = {1,2,3}; for (auto it = v.begin(); it != v.end(); ++it) { ... } for (auto& elem : v) { ... } // range-based for
4. override và final
class Base {
virtual void foo() {}
virtual void bar() {}
};
class Derived : Base {
void foo() override {} // OK - override virtual
// void foo() final {} // Lỗi: final trên override
void baz() override {} // LỖI: Base không có baz()
void bar() final {} // OK - override và khóa không override nữa
};
class MoreDerived : Derived {
// void bar() {} // LỖI: bar() là final
};
5. Deleted và Defaulted functions
class NonCopyable {
public:
NonCopyable() = default; // Yêu cầu compiler sinh default ctor
NonCopyable(const NonCopyable&) = delete; // Cấm copy
NonCopyable& operator=(const NonCopyable&) = delete; // Cấm assign
~NonCopyable() = default; // Default dtor
};
6. Strongly-typed enums (enum class)
// Cũ: unscoped enum - pollute namespace
enum Color { RED, GREEN, BLUE };
Color c = RED; // OK nhưng RED leak ra scope
// Mới: scoped enum
enum class Color { Red, Green, Blue };
Color c = Color::Red; // Phải qualify
// int x = c; // LỖI: không chuyển ngầm sang int
int x = static_cast(c); // Ép kiểu tường minh
7. static_assert và type traits
#includestatic_assert(sizeof(int) == 4, "int phải 4 bytes"); static_assert(std::is_pod ::value, "Phải là POD"); // C++17: _v suffix static_assert(std::is_pod_v );
8. Range-based for loops
std::vectorv = {1, 2, 3, 4, 5}; for (auto& x : v) { x *= 2; } // Sửa đổi for (const auto& x : v) { cout << x; } // Read-only for (auto x : v) { ... } // Copy (tránh nếu object lớn) // C-array cũng dùng được int arr[] = {1,2,3}; for (int x : arr) { ... }
Tóm tắt hỗ trợ VS2015
| Tính năng | VS2015 |
|---|---|
| nullptr | ✓ Hoàn toàn |
| Lambda | ✓ Hoàn toàn |
| auto | ✓ Hoàn toàn |
| override/final | ✓ Hoàn toàn |
| =delete/=default | ✓ Hoàn toàn |
| enum class | ✓ Hoàn toàn |
| static_assert | ✓ Hoàn toàn |
| Range-based for | ✓ Hoàn toàn |
| Variadic templates | ✓ Hoàn toàn |
| Initializer lists | ✓ Hoàn toàn |
| Smart pointers | ✓ (std::unique_ptr, shared_ptr) |