Novidades do novo padrão C++ Vinícius dos Santos Oliveira Histórico ● 2005 ● ● C++ Technical Report 1 2011 ● Final de março – – ● JTC1/SC22/WG21 C++ Standards Committee decide pela aprovação do novo padrão. GCC 4.6 lançado Começo de abril – Clang 2.9 lançado C++0x ● ● ● A linguagem em si foi aperfeiçoada ● Performance ● Usabilidade ● Segurança ● … A biblioteca padrão contém mais funcionalidades para tarefas comuns ● Threads ● Strings ● … Remoção de funcionalidades obsoletas ● export ● Especificação de exceções ● std::auto_ptr Compiladores ● ● GCC 4.6 ● http://gcc.gnu.org/projects/cxx0x.html ● Opção -std=c++0x LLVM/Clang 2.9 ● ● … http://clang.llvm.org/cxx_status.html Inicialização uniforme Inicialização uniforme struct Foo { int x, y; }; int main() { Foo bar = {0, 0}; } Inicialização uniforme struct Foo { int x, y; Foo (int x, int y): x(x), y(y) {} }; int main() { Foo bar = {0, 0}; } Inicialização uniforme struct Foo { int x, y; Foo (int x, int y): x(x), y(y) {} }; int main() { Foo bar = {0, 0}; // ERRO DE SINTAXE } Inicialização uniforme struct Foo { int x, y; Foo (int x, int y): x(x), y(y) {} }; int main() { Foo bar = {0, 0}; // VÁLIDO } Inicialização uniforme struct Foo { int x, y; Foo (int x, int y): x(x), y(y) {} }; int main() { Foo bar = {0, 0}; // VÁLIDO Foo x{0, 0}; } Listas inicializadoras Listas inicializadoras ● int array[] = {0, 1, 2}; ● vector<int> v(array, array + 3); Listas inicializadoras ● int array[] = {0, 1, 2}; ● vector<int> v = {0, 1, 2}; Listas inicializadoras class MyClass { public: MyClass(std::initializer_list<string> list); }; int main() { MyClass foobar = {“Hello”, “World”}; return 0; } auto e decltype auto e decltype for (vector<int>::iterator i = v.begin();i != v.end();++i) { cout << *i << endl; } auto e decltype for (vector<int>::iterator i = v.begin();i != v.end();++i) { cout << *i << endl; } auto e decltype for (auto i = v.begin();i != v.end();++i) { cout << *i << endl; } auto e decltype auto foobar = 1; decltype(foobar) i = foobar + foobar; decltype((foobar)) i_ref = i; auto e decltype auto foobar = 1; decltype(foobar) i = foobar + foobar; // int decltype((foobar)) i_ref = i; // int& foreach foreach for (int i: my_vector) { cout << i << endl; } foreach for (int i: my_vector) { cout << i << endl; } for (int &i: my_vector) { i = 2; } default e delete default e delete struct MyClass { MyClass(); MyClass(const MyClass&); MyClass & operator=(const MyClass&); }; default e delete struct MyClass { MyClass(int x); }; default e delete struct MyClass { MyClass(int x); MyClass() = default; }; default e delete class MyClass { private: MyClass(const MyClass&); MyClass & operator=(const MyClass&); }; default e delete struct MyClass { MyClass(const MyClass&) = delete; MyClass & operator=(const MyClass&) = delete; }; default e delete struct MyClass { void f(double); void double(int) = delete; }; default e delete struct MyClass { void f(double); template<typename T> void f(T) = delete; }; Strings unicode Strings unicode ● char ● ● “test” wchat_t ● L“test” Strings unicode ● char ● ● wchat_t ● ● L“test” char16_t ● ● “test” // agora UTF-8 u“test” char32_t ● U“test” Strings unicode “test \uXXXX” Enumerações Enumerações enum E { TEST, TEST2 }; int main() { enum E TEST = TEST2; enum E foobar = TEST; return 0; } Enumerações enum class E { TEST, TEST2 }; int main() { enum E TEST = E::TEST2; enum E foobar = E::TEST; return 0; } Enumerações enum E: int { TEST }; Outros avanços ● ● Linguagem ● Move constructors ● Uso de templates com o código compilado compartilhado (extern) ● Variadic templates ● static_assert ● Raw strings ● Lambda ● … Biblioteca ● Threads ● Tipo tupla ● Expressões regulares ● Smart pointers ● …