Prévia do material em texto
ContentsContents
Microsoft C/C++ no Visual Studio
C++ no Visual Studio
Visão geral do desenvolvimento em C++ no Visual Studio
Novidades do C++ no Visual Studio
Aprimoramentos de conformidade do C++ no Visual Studio
Conformidade com a linguagem do Microsoft C++
Plataformas de destino com suporte
Ferramentas e funcionalidades do C++ em edições do Visual Studio
Instalar o suporte C11 e C17 no Visual Studio
Exemplos
Ajuda e comunidade
Como relatar um problema com o conjunto de ferramentas do Visual C++
Tutoriais do Visual Studio C++
Instalar o suporte ao C++ no Visual Studio
Criar e editar um projeto de aplicativo de console C++
Desenvolver e executar um projeto de aplicativo de console C++
Criar uma calculadora de console em C++
Criar um aplicativo UWP
Criar um aplicativo da área de trabalho do Windows
Criar um jogo DirectX
Sistemas de build e projetos
Ler e escrever código no Visual Studio
Desenvolvimento da área de trabalho do Windows
Desenvolvimento da UWP
Desenvolvimento de jogos
Desenvolvimento em Linux
Desenvolvimento móvel multiplataforma
Desenvolvimento .NET com C++/CLI
Programação de Nuvem e da Web
https://docs.microsoft.com/windows/uwp/cpp-and-winrt-apis/get-started
https://docs.microsoft.com/windows/desktop/learnwin32/learn-to-program-for-windows
https://docs.microsoft.com/windows/uwp/gaming/tutorial--create-your-first-uwp-directx-game
file:///T:/maa1/mf4q/cpp/6a503ed6/linux/index.json
file:///T:/maa1/mf4q/cpp/6a503ed6/cross-platform/index.json
Portar e atualizar código C++
Práticas recomendadas de segurança para C++
Práticas recomendadas de segurança para C++
Executar como membro do grupo de usuários
Como o UAC (Controle de Conta de Usuário) afeta seu aplicativo
Diretrizes para desenvolvedores de C++ para canais do lado de execução
especulativos
Referência
Linguagem C/C++ e Bibliotecas padrão
Referência de linguagens
Linguagens
Referência de linguagem C
Referência da linguagem C++
Referência de pré-processador C/C++
Intrínsecos do compilador e linguagem assembly
Intrínsecos do compilador
Referência do assembler ARM
Assembly embutido no MSVC
Referência do MASM (Microsoft Macro Assembler)
Extensões de componentes para .NET e UWP
Atributos C++ para COM e .NET
Referência de bibliotecas
Libraries
Referência da CRT (biblioteca em tempo de execução) C
Referência da Biblioteca Padrão C++
Biblioteca SafeInt
Biblioteca SafeInt
Classe SafeInt
Funções (SafeInt)
Classe SafeIntException
MFC/ATL
Bibliotecas paralelas
Bibliotecas de acesso a dados
C++ no Visual Studio
12/11/2020 • 15 minutes to read • Edit Online
NOTENOTE
NOTENOTE
NOTENOTE
Esta documentação do desenvolvedor se aplica ao Visual Studio 2019. Para ver a documentação da sua versão preferida do
Visual Studio, use o controle seletor de versãoversão . Ele é encontrado na parte superior do Sumário nesta página.
Se você estiver procurando um pacote redistribuível Microsoft Visual C++ 2019, para poder executar um programa, vá para
a página de downloads do site Microsoft Visual Studio. Em todos os downloadstodos os downloads , expanda a seção outras ferramentas,outras ferramentas,
estruturas e redistribuíveisestruturas e redistribuíveis . Selecione sua arquitetura de destino e, em seguida, escolha o botão baixarbaixar .
Para redistribuíveis mais antigos, abra a página de downloads mais antiga . Expanda a seção outras ferramentas,outras ferramentas,
estruturas e redistribuíveisestruturas e redistribuíveis . Localize a versão redistribuível que você deseja baixar, selecione sua arquitetura de destino
e, em seguida, escolha o botão baixarbaixar .
Esta documentação do desenvolvedor se aplica ao Visual Studio 2017. Para ver a documentação da sua versão preferida do
Visual Studio, use o controle seletor de versãoversão . Ele é encontrado na parte superior do Sumário nesta página.
Se você estiver procurando um Microsoft Visual C++ 2017 ou um pacote redistribuível mais antigo para poder executar um
programa, acesse a página de downloads mais antigos do site do Microsoft Visual Studio. Expanda a seção outrasoutras
ferramentas, estruturas e redistribuíveisferramentas, estruturas e redistribuíveis . Localize a versão redistribuível que você deseja baixar, selecione sua
arquitetura de destino e, em seguida, escolha o botão baixarbaixar .
Esta documentação do desenvolvedor se aplica ao Visual Studio 2015. Para ver a documentação da sua versão preferida do
Visual Studio, use o controle seletor de versãoversão . Ele é encontrado na parte superior do Sumário nesta página.
Se você estiver procurando um Microsoft Visual C++ 2015 ou um pacote redistribuível mais antigo para poder executar um
programa, acesse a página de downloads mais antigos do site do Microsoft Visual Studio. Expanda a seção outrasoutras
ferramentas, estruturas e redistribuíveisferramentas, estruturas e redistribuíveis . Localize a versão redistribuível que você deseja baixar, selecione sua
arquitetura de destino e, em seguida, escolha o botão baixarbaixar .
Microsoft Visual C++ (MSVC) refere-se às ferramentas e bibliotecas de desenvolvimento de linguagem de
assembly, C++ e C, disponíveis como parte do Visual Studio no Windows. Essas ferramentas e bibliotecas
permitem que você crie aplicativos da UWP (Plataforma Universal do Windows), aplicativos de servidor e área de
trabalho Windows nativos, bibliotecas e aplicativos multiplataforma que são executados no Windows, Linux,
Android e iOS, bem como bibliotecas e aplicativos que usam o .NET Framework. Você pode usar o MSVC para
escrever tudo, desde aplicativos simples de console até os aplicativos mais sofisticados e complexos para o
Windows desktop, de drivers de dispositivo e componentes de sistema operacional até jogos de plataforma
cruzada para dispositivos móveis e dos menores dispositivos IoT para computação de alto desempenho de vários
servidores na nuvem do Azure.
O Visual Studio 2015, 2017 e 2019 podem ser instalados lado a lado. Você pode usar o Visual Studio 2019
(compilador de conjunto de ferramentas v142) ou o Visual Studio 2017 (v141) para editar e criar programas
usando o conjunto de ferramentas do Visual Studio 2017 (v141) e do Visual Studio 2015 (V140).
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/visual-cpp-in-visual-studio.md
https://visualstudio.microsoft.com/downloads/
https://visualstudio.microsoft.com/vs/older-downloads/
https://visualstudio.microsoft.com/vs/older-downloads/
https://visualstudio.microsoft.com/vs/older-downloads/
Histórico de novidades e de conformidade
Instalar o Visual Studio e atualizar de versões anteriores
Aprender sobre o C++
Ferramentas de desenvolvimento do C++
O que há de novo para C++ no Visual Studio
Descubra as novidades do Visual Studio.
O que há de novo para C++ no Visual Studio 2003 até 2015
Descubra quais foram as novidades do C++ para cada versão do Visual Studio, de 2003 até 2015.
Melhorias de conformidade do C++ no Visual Studio
Saiba mais sobre as melhorias de conformidade do C++ no Visual Studio.
Tabela de conformidade da linguagem Microsoft C++
Uma lista de status de conformidade por recurso no compilador C++ do MSVC.
Histórico de alterações do Microsoft C/C++ 2003-2015
Saiba mais sobre as alterações significativas nas versões anteriores.
Instalar o suporte a C++ no Visual Studio
Baixe o Visual Studio e instale o conjunto de ferramentas do Microsoft C/C++.
Guia de atualização e portabilidade do Microsoft C++
Diretrizes para portabilidade de código e para atualização de projetos para o Visual Studio 2015 ou posterior para
aproveitar a maior conformidade do compilador com o padrão do C++, além de tempos de compilação e
recursos de segurança muito aprimorados como a mitigação do Spectre.
Ferramentas e recursos do C++ nas edições do Visual Studio
Descubra as diferentes edições do Visual Studio.
Plataformas com suporte
Descubra em quais plataformas o compilador do Microsoft C/C++ dá suporte.
Bem-vindo de volta ao C++
Saibamais sobre as técnicas de programação modernas do C++ com base no C++11 e versões posteriores que
permitem que você escreva código rápido e seguro e evite muitas armadilhas do estilo de programação em C.
C++ padrão
Saiba mais sobre o C++, obtenha uma visão geral do C++ Moderno e encontre links para livros, artigos, links e
eventos
Aprenda o Visual Studio e crie seu primeiro projeto C++
Comece a aprender a escrever C++ no Visual Studio.
Amostras do Visual Studio C++
Informações sobre os exemplos de código C++ fornecidos pela Microsoft.
Visão geral do desenvolvimento em C++ no Visual Studio
Como usar o IDE do Visual Studio para criar projetos, editar código, vincular a bibliotecas, compilar, depurar, criar
testes de unidade, fazer análise estática, implantar e muito mais.
Projetos e sistemas de compilação
Como criar e configurar projetos do Visual Studio C++, projetos CMake e outros tipos de projetos com as opções
de compilador e vinculador do MSVC.
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-what-s-new-2003-through-2015
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-change-history-2003-2015
https://docs.microsoft.com/pt-br/cpp/cpp/welcome-back-to-cpp-modern-cpp
https://isocpp.org/
Escrever aplicativos em C++
Referência de linguagens
Escrevendo e Refatorando o código do C++
Como usar os recursos de produtividade no editor do C++ para refatorar, navegar, entender e escrever código.
Depuração de código nativo
Use o depurador do Visual Studio com projetos C++.
Visão geral da análise de código para C/C++
Use anotações de SAL ou os verificadores das Diretrizes Principais do C++ para executar análise estática.
Escrever testes de unidade para C/C++ no Visual Studio
Crie testes de unidade usando a Estrutura de Teste de Unidade da Microsoft para C++, Google Test, Boost.Test ou
CTest.
Aplicativos universais do Windows (C++)
Encontre guias e conteúdo de referência no Centro de Desenvolvedores do Windows. Para obter informações de
como desenvolver aplicativos UWP, confira Introdução à Plataforma Universal do Windows e Criar um app "Hello
world" em C++.
Aplicativos de desktop (C++)
Saiba como criar aplicativos da área de trabalho tradicionais, nativos, em C++ para Windows.
Programação .NET com C++/CLI
Saiba como criar DLLs que permitem a interoperabilidade entre programas nativos em C++ e no .NET escritos
em linguagens como C# ou Visual Basic.
Programação em Linux
Use o Visual Studio IDE para codificar e implantar em um computador Linux remoto para compilação com GCC.
Criar DLLs C/C++ no Visual Studio
Descubra como usar o Win32, o ATL e o MFC para criar DLLs de área de trabalho do Windows e fornece
informações sobre como compilar e registrar sua DLL.
Programação paralela
Saiba como usar a Biblioteca de Padrões Paralelos, C++ AMP, OpenMP e outros recursos que estão relacionados
ao multithreading no Windows.
Práticas recomendadas de segurança
Saiba como proteger aplicativos contra código mal-intencionado e de uso não autorizado.
Programação na nuvem e na Web
No C++ há várias opções para conectar-se com a Web e com a nuvem.
Acesso a dados
Conecte-se a bancos de dados usando ODBC e OLE DB.
Texto e cadeias de caracteres
Saiba mais sobre como trabalhar com formatos e codificações diferentes de texto e de cadeia de caracteres para
desenvolvimento local e internacional.
Referência da linguagem C++
O guia de referência para a implementação da Microsoft da linguagem de programação C++.
Referência de pré-processador do C/C++
https://docs.microsoft.com/pt-br/cpp/ide/writing-and-refactoring-code-cpp
https://docs.microsoft.com/pt-br/visualstudio/debugger/debugging-native-code
https://docs.microsoft.com/pt-br/cpp/code-quality/code-analysis-for-c-cpp-overview
https://docs.microsoft.com/pt-br/visualstudio/test/writing-unit-tests-for-c-cpp
https://docs.microsoft.com/pt-br/windows/uwp/get-started/universal-application-platform-guide
https://docs.microsoft.com/pt-br/windows/uwp/get-started/create-a-basic-windows-10-app-in-cpp
https://docs.microsoft.com/pt-br/cpp/windows/desktop-applications-visual-cpp
file:///T:/maa1/mf4q/cpp/6a503ed6/linux/index.json
https://docs.microsoft.com/pt-br/cpp/build/dlls-in-visual-cpp
https://docs.microsoft.com/pt-br/cpp/text/text-and-strings-in-visual-cpp
Bibliotecas do C++ no Visual Studio
Bibliotecas C++ de software livre de terceiros
Comentários e comunidade
Uma referência comum ao pré-processador de linguagem C e C++ compartilhado.
Referência da linguagem C
O guia de referência para a implementação da linguagem de programação C da Microsoft.
Intrínsecos do compilador e linguagem do assembly
Guias para o compilador intrínsecos com suporte ou implementados pelos compiladores C/C++ da Microsoft em
cada plataforma.
As seções a seguir fornecem informações sobre as diferentes bibliotecas do C e C++ que estão incluídas no
Visual Studio.
Referência da biblioteca de tempo de execução C
Inclui alternativas aprimoradas de segurança a funções que são conhecidas por impor problemas de segurança.
Biblioteca padrão do C++
A Biblioteca Padrão do C++.
Active Template Library (ATL)
Compatibilidade com aplicativos e componentes COM.
Bibliotecas do Microsoft Foundation Class (MFC)
Suporte para criação de aplicativos da área de trabalho com interfaces de usuário tradicionais ou no estilo Office.
Biblioteca de padrões paralelos (PPL)
Algoritmos assíncronos e paralelos que são executados na CPU.
C++ AMP (C++ Accelerated Massive Parallelism)
Algoritmos totalmente paralelos que são executados na GPU.
WRL (biblioteca de modelos de Windows Runtime)
Aplicativos UWP (Plataforma Universal do Windows) e componentes.
Programação .NET com C++/CLI
Programação para o CLR (Common Language Runtime).
A ferramenta de linha de comando vcpkgvcpkg multiplataforma simplifica bastante a descoberta e a instalação de
mais de 900 bibliotecas C++ de software livre. Consulte vcpkg: gerenciador de pacotes de C++ para Windows.
Microsoft Docs Q&A
Microsoft Docs hospeda fóruns pesquisáveis para perguntas e respostas. Adicione uma C++ marca à sua
postagem para assistência da Comunidade sobre problemas relacionados ao C++.
Como relatar um problema com o conjunto de ferramentas do Microsoft C/C++
Saiba como criar relatórios de erros efetivos no conjunto de ferramentas do Microsoft C/C++ (compilador,
vinculador e outras ferramentas) e maneiras de enviar seu relatório.
Blog da equipe do Microsoft C++
Saiba mais sobre os novos recursos e as informações mais recentes dos desenvolvedores das ferramentas do
C++ no Visual Studio.
Comunidade de desenvolvedores do Visual Studio C++
https://docs.microsoft.com/pt-br/cpp/atl/atl-com-desktop-components
https://docs.microsoft.com/pt-br/cpp/mfc/mfc-desktop-applications
https://docs.microsoft.com/pt-br/cpp/parallel/concrt/parallel-patterns-library-ppl
https://docs.microsoft.com/pt-br/cpp/parallel/amp/cpp-amp-cpp-accelerated-massive-parallelism
https://docs.microsoft.com/pt-br/cpp/cppcx/wrl/windows-runtime-cpp-template-library-wrl
https://docs.microsoft.com/pt-br/cpp/build/vcpkg
https://docs.microsoft.com/pt-br/answers/topics/c%2b%2b.html
https://devblogs.microsoft.com/cppblog/
https://aka.ms/vsfeedback/browsecpp
Obtenha ajuda, arquivos de erros e faça sugestões para C++ no Visual Studio.
Visão geral do desenvolvimento em C++ no Visual
Studio
02/11/2020 • 11 minutes to read • Edit Online
Criar projetos
Como parte do IDE (Ambiente de Desenvolvimento Integrado) do Visual Studio, o MSVC (Microsoft C++)
compartilha muitas janelas e ferramentas com outras linguagens. Muitas delas, incluindo o Gerenciador deGerenciador de
SoluçõesSoluções , o editor de códigos e o depurador, estão documentadas no IDE do Visual Studio. Geralmente, uma
ferramenta ou uma janela compartilhada tem um conjunto de recursos ligeiramente diferente para o C++
comparado a outra linguagens. Algumas janelas ou ferramentas só estão disponíveis no Visual Studio Professional
ou nas edições do Visual Studio Enterprise.
Além dasferramentas compartilhadas no IDE do Visual Studio, o MSVC tem várias ferramentas especificamente
para o desenvolvimento de código nativo. Essas ferramentas também são listadas neste artigo. Para obter uma
lista de quais ferramentas estão disponíveis em cada edição do Visual Studio, confira Ferramentas e recursos do
C++ em edições do Visual Studio.
Um projeto é basicamente um conjunto de arquivos de código-fonte e recursos, como imagens ou arquivos de
dados que são compilados em um programa ou biblioteca executável.
O Visual Studio dá suporte a qualquer sistema de projeto ou ferramenta de build personalizada que você deseje
usar, com suporte total para IntelliSense, navegação e depuração:
O MSBuildMSBuild é o sistema de projeto nativo para o Visual Studio. Ao selecionar arquivoarquivo > novonovo > projetoprojeto
no menu principal, você verá muitos tipos de modelos de projeto do MSBuild que o ajudarão a desenvolver
rapidamente diferentes tipos de aplicativos em C++.
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/overview-of-cpp-development.md
https://docs.microsoft.com/pt-br/visualstudio/get-started/visual-studio-ide
Adicionar ao controle do código-fonte
Em geral, você deve usar esses modelos para novos projetos, a menos que esteja usando projetos CMake
ou outro sistema de projeto. Para saber mais, confira Criar e gerenciar projetos baseados no MSBuild.
O CMakeCMake é um sistema de Build de plataforma cruzada que é integrado ao IDE do Visual Studio quando
você instala o desenvolvimento de desktop com a carga de trabalho do C++. É possível usar o modelo de
projeto CMake para novos projetos ou simplesmente abrir uma pasta com um arquivo CMakeLists.txt. Para
saber mais, confira Projetos CMake no Visual Studio.
Qualquer outro sistema de compilação C++, incluindo uma coleção flexível de arquivos, tem suporte por
meio do recurso abrir pastaabrir pasta . Crie arquivos JSON simples para invocar o programa de build e configurar
sessões de depuração. Para saber mais, veja Projetos Open Folder para C++.
O controle do código-fonte permite coordenar o trabalho entre diversos desenvolvedores, isolar o trabalho em
andamento do código de produção e fazer backup do código-fonte. O Visual Studio é compatível com o Git e o
TFVC (Controle de Versão do Team Foundation) por meio da janela Team ExplorerTeam Explorer .
https://docs.microsoft.com/pt-br/cpp/build/creating-and-managing-visual-cpp-projects
https://docs.microsoft.com/pt-br/cpp/build/cmake-projects-in-visual-studio
https://docs.microsoft.com/pt-br/cpp/build/open-folder-projects-cpp
https://docs.microsoft.com/pt-br/azure/devops/repos/tfvc/
Obter bibliotecas
Criar interfaces do usuário com designers
Para saber mais sobre a integração do Git com repositórios no Azure, confira Compartilhar código com o Visual
Studio 2017 e o Git do Azure Repos. Para saber mais sobre a integração do Git com o GitHub, confira Extensão do
GitHub para Visual Studio.
Use o gerenciador de pacotes vcpkg para obter e instalar bibliotecas de terceiros. No momento, mais de 900
bibliotecas open-source estão disponíveis no catálogo.
Se o programa tiver uma interface do usuário, você poderá usar um designer para populá-lo rapidamente com
controles como botões, caixas de listagem e assim por diante. Ao arrastar um controle da janela de ferramentas e
soltá-lo na superfície de design, o Visual Studio gerará os recursos e o código necessários para fazer tudo
funcionar. Em seguida, você escreverá o código para personalizar a aparência e o comportamento.
https://docs.microsoft.com/pt-br/azure/devops/repos/git/share-your-code-in-git-vs-2017
https://visualstudio.github.com/
https://docs.microsoft.com/pt-br/cpp/build/vcpkg
Escrever código
Para obter mais informações sobre como criar uma interface do usuário para um aplicativo Plataforma Universal
do Windows, consulte design e IU.
Para obter mais informações sobre como criar uma interface do usuário para um aplicativo MFC, confira
Aplicativos da área de trabalho do MFC. Para obter informações sobre programas Windows Win32, confira
Aplicativos da área de trabalho do Windows.
Depois que você cria um projeto, todos os arquivos de projeto são exibidos na janela Gerenciador de SoluçõesGerenciador de Soluções .
(Uma solução é um contêiner lógico para um ou mais projetos relacionados.) Quando você clica em um arquivo. h
ou. cpp em Gerenciador de soluçõesGerenciador de soluções , o arquivo é aberto no editor de código.
O editor de códigos é um processador de texto especializado para código-fonte C++. Ele codifica por cores os
nomes de palavras-chave, de métodos e de variáveis da linguagem e outros elementos do código para tornar o
código mais legível e mais fácil de ser entendido. Ele também fornece ferramentas para refatoração de código,
navegação entre diferentes arquivos e noções básicas sobre como o código é estruturado. Para saber mais, confira
https://developer.microsoft.com/windows/design
https://docs.microsoft.com/pt-br/cpp/mfc/mfc-desktop-applications
https://docs.microsoft.com/pt-br/cpp/windows/desktop-applications-visual-cpp
Adicionar e editar recursos
Build (compilar e vincular)
Depurar
Escrever e refatorar código.
Um programa ou DLL do Windows geralmente inclui alguns recursos , como caixas de diálogo, ícones, imagens,
cadeias de caracteres localizáveis, telas de abertura, cadeias de conexão de banco de dados ou qualquer dado
arbitrário. O Visual Studio inclui ferramentas para adicionar e editar recursos. Para obter mais informações,
consulte trabalhando com arquivos de recursos.
Escolha cr iarcr iar > solução de compilaçãosolução de compilação na barra de menus ou insira a combinação de teclas Ctr l + Shift + BCtr l + Shift + B
para compilar e vincular um projeto. Erros e avisos de compilação são relatados no Lista de Erros ( Ctr l + \ , eCtr l + \ , e ). A
janela saídasaída ( ALT + 2ALT + 2 ) mostra informações sobre o processo de compilação.
Para saber mais sobre como configurar builds, confira Como trabalhar com Propriedades de Projeto e Projetos e
sistemas de build.
Use também o compilador (cl.exe) e muitas outras ferramentas autônomas relacionadas a build, como NMAKE e
LIB, diretamente na linha de comando. Para obter mais informações, confira Compilar o código C/C++ na linha de
comando e Referência de build do C/C++.
É possível iniciar a depuração pressionando F5F5 . A execução pausa em todos os pontos de interrupção que você
definiu (pressionando F9F9 ). Você também pode percorrer o código uma linha por vez ( F10F10 ), exibir os valores das
variáveis ou dos registros e, mesmo em alguns casos, fazer alterações no código e continuar a depuração sem
precisar compilá-la novamente. A ilustração a seguir mostra uma sessão de depuração em que a execução é
pausada no ponto de interrupção. Os valores dos membros da estrutura de dados são visíveis na janelajanela
InspeçãoInspeção .
https://docs.microsoft.com/pt-br/cpp/ide/writing-and-refactoring-code-cpp
https://docs.microsoft.com/pt-br/cpp/windows/working-with-resource-files
https://docs.microsoft.com/pt-br/cpp/build/working-with-project-properties
https://docs.microsoft.com/pt-br/cpp/build/building-on-the-command-line
https://docs.microsoft.com/pt-br/cpp/build/reference/c-cpp-building-reference
Teste
Analisar
Implantar aplicativos concluídos
Para obter mais informações, consulte Depuração no Visual Studio.
O Visual Studio inclui o Microsoft Unit Test Framework para C++, além de suporte para Boost.Test, Google Test e
CTest. Execute os testes na janela do Gerenciador de TestesGerenciador de Testes :
Para saber mais, confira Verificar código usando testes de unidade e Gravar testes de unidade para C/C++ no
Visual Studio.
O Visual Studio inclui ferramentas de análise de código estático que podem detectar possíveis problemas no
código-fonte. Essas ferramentas incluem uma implementação dos verificadores de regras das Diretrizes Principais
do C++. Para obter mais informações, confiraVisão geral da análise de código do C/C++.
É possível implantar os aplicativos tradicionais de área de trabalho e os aplicativos da UWP para os clientes por
https://docs.microsoft.com/pt-br/visualstudio/debugger/debugging-in-visual-studio
https://docs.microsoft.com/pt-br/visualstudio/test/unit-test-your-code
https://docs.microsoft.com/pt-br/visualstudio/test/writing-unit-tests-for-c-cpp
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md
https://docs.microsoft.com/pt-br/cpp/code-quality/code-analysis-for-c-cpp-overview
Próximas etapas
meio da Microsoft Store. A implantação do CRT é manipulada automaticamente em segundo plano. Para obter
mais informações, confira Publicar aplicativos e jogos do Windows.
Você também pode implantar uma área de trabalho C++ nativa em outro computador. Para obter mais
informações, confira Implantando aplicativos da área de trabalho.
Para obter mais informações sobre como implantar um programa do C++/CLI, confira Guia de Implantação para
Desenvolvedores.
Explore ainda mais o Visual Studio seguindo um dos seguintes artigos introdutórios:
Saiba como usar o editor de códigos
Saiba mais sobre projetos e soluções
https://docs.microsoft.com/pt-br/windows/uwp/publish/
https://docs.microsoft.com/pt-br/cpp/windows/deploying-native-desktop-applications-visual-cpp
https://docs.microsoft.com/pt-br/dotnet/framework/deployment/deployment-guide-for-developers
https://docs.microsoft.com/pt-br/visualstudio/get-started/tutorial-editor
https://docs.microsoft.com/pt-br/visualstudio/get-started/tutorial-projects-solutions
Novidades do C++ no Visual Studio
12/11/2020 • 90 minutes to read • Edit Online
compilador C++
Geração de código, segurança, diagnóstico e controle de versãoGeração de código, segurança, diagnóstico e controle de versão
Melhorias da biblioteca padrão do C++
Melhorias de desempenho/taxa de transferência no compilador e na
biblioteca padrão
N ovidades de C++ no Visual Studio 2017
O Visual Studio 2019 traz muitas atualizações e correções para o ambiente do Microsoft C++. Corrigimos vários
bugs e problemas no compilador e nas ferramentas. Muitos deles enviados pelos clientes pelas opções Relatar um
Problema e Fornecer uma Sugestão em Enviar Comentár iosEnviar Comentár ios . Obrigado por relatar bugs! Para saber mais sobre
todas as novidades do Visual Studio, visite Novidades no Visual Studio 2019. Para saber mais sobre novidades de
C++ no Visual Studio 2017, confira . Para saber mais sobre as novidades de C++ no Visual Studio 2015 e em
versões anteriores, confira O que há de novo no Visual C++ de 2003 a 2015.
Suporte aprimorado para recursos e correções exatas do C++17, além de suporte experimental para
recursos de C++20, como módulos e corrotinas. Para obter informações detalhadas, consulte
Aprimoramentos de conformidade do C++ no Visual Studio 2019.
A /std:c++latest opção agora inclui os recursos do c++ 20 que não estão necessariamente completos,
incluindo suporte inicial para o operador do c++ 20 <=> ("espaço") para comparação de três vias.
A opção de compilador C++ /Gm foi preterida. Considere desabilitar a opção /Gm em seus scripts de build
se ela estiver definida explicitamente. No entanto, você pode ignorar com segurança o aviso de substituição
para /Gm , pois ela não é tratada como erro ao usar "Tratar avisos como erros" ( /WX ).
Como o MSVC começa a implementação dos recursos do rascunho padrão do C++20 sob o sinalizador
/std:c++latest , /std:c++latest agora é compatível com /clr (todas as versões), /ZW e /Gm . No Visual
Studio 2019, use os modos /std:c++17 ou /std:c++14 ao compilar com /clr , /ZW ou /Gm (mas
consulte marcador anterior).
Cabeçalhos pré-compilados não são mais gerados por padrão para aplicativos para desktop e de console
do C++.
Análise aprimorada com /Qspectre para fornecer assistência de mitigação para Variante de Espectro 1 (CVE-
2017-5753). Para obter mais informações, consulte Mitigações do Spectre no MSVC.
Implementação de correções exatas e recursos de biblioteca adicionais do C++17 e do C++20. Para obter
informações detalhadas, consulte Aprimoramentos de conformidade do C++ no Visual Studio 2019.
Clang-Format aplicado aos cabeçalhos da biblioteca padrão de C++ para mais facilidade de leitura.
Como o Visual Studio agora dá suporte a Apenas Meu Código para C++, a biblioteca padrão não precisa
mais fornecer maquinário personalizado para que std::function e std::visit cheguem ao mesmo efeito.
A remoção desse mecanismo não tem efeitos visíveis pelo usuário. Uma exceção é que o compilador não
produzirá mais diagnósticos que indiquem problemas na linha 15732480 ou 16707566 do <type_traits>
ou <variant> .
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md
https://docs.microsoft.com/pt-br/visualstudio/ide/how-to-report-a-problem-with-visual-studio?view=vs-2019&preserve-view=true
https://aka.ms/feedback/suggest?space=62
https://docs.microsoft.com/pt-br/visualstudio/ide/whats-new-visual-studio-2019
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-what-s-new-2003-through-2015
https://devblogs.microsoft.com/cppblog/spectre-mitigations-in-msvc/
Melhorias de produtividade de build, incluindo a forma como o vinculador manipula a E/S de Arquivo e o
tempo de vinculação na criação e mesclagem de tipo PDB.
Adicionamos suporte básico para vetorização de SIMD OpenMP. Você pode habilitá-lo usando a nova
opção de compilador /openmp:experimental . Esta opção permite que loops anotados com
#pragma omp simd sejam potencialmente vetorizados. A vetorização não é garantida. Um aviso será relatado
para loops anotados, mas não vetorizados. Não há suporte para cláusulas SIMD, elas são ignoradas com
um aviso relatado.
Adicionada uma nova opção de linha de comando de inalinhamento /Ob3 , que é uma versão mais
agressiva do /Ob2 . /O2 (otimizar o binário para velocidade) ainda implica /Ob2 por padrão. Se você
achar que o compilador não está embutido agressivamente suficiente, considere a possibilidade de passar
/O2 -Ob3 .
Adicionamos suporte para funções intrínsecas de SVML (biblioteca matemática de vetores). Essas funções
calculam os equivalentes do vetor de 128 bits, 256 bits ou 512 bits. Nós os adicionamos para dar suporte à
vetorização à mão de loops com chamadas para funções de biblioteca de matemática e outras operações
como divisão de inteiros. Consulte o Guia intrínseco Intel para obter definições das funções compatíveis.
Novas e aprimoradas otimizações:
Avaliação de constantes e simplificações aritméticas para expressões usando intrínsecos de vetor de
SIMD, tanto para formulários float quanto integer.
Uma análise mais eficiente para extrair informações do fluxo de controle (instruções if/else/switch)
para remover branches que comprovadamente sempre resultam em true ou false.
Desenrolamento aprimorado de memset para usar as instruções do vetor SSE2.
Remoção aprimorada de cópias de classe/struct inúteis, especialmente para programas do C++ que
passam por valor.
Aprimorada a otimização de códigos que usam memmove , como as construções std::copy ou
std::vector e std::string .
Otimizado o design físico de biblioteca padrão para evitar a compilação de partes da biblioteca padrão não
incluídas diretamente. Essa alteração reduz o tempo de compilação de um arquivo vazio que inclui apenas
<vector> na metade. Como consequência, talvez você precise adicionar diretivas #include aos cabeçalhos
que foram incluídos anteriormente de maneira indireta. Por exemplo, o código que usa std::out_of_range
agora pode precisar de #include <stdexcept> . O código que usa um operador de inserção de fluxo agora
pode precisar de #include <ostream> . O benefício é que apenas as unidades de tradução que realmente
usam <stdexcept> ou <ostream> componentes pagam o custo da taxa de transferência para compilá-las.
if constexpr foi aplicado em mais lugares na biblioteca padrão para aumento da taxade transferência e
redução do tamanho do código em operações de cópia, em permutações como reverter e girar, e na
biblioteca de algoritmos paralelos.
A biblioteca padrão agora usa if constexpr internamente para reduzir os tempos de compilação, mesmo
no modo C++14.
A detecção de vinculação dinâmica do runtime para a biblioteca de algoritmos paralelos não usa mais uma
página inteira para armazenar a matriz do ponteiro de função. Marcar essa memória como somente leitura
deixou de ser considerado relevante para fins de segurança.
O construtor de std::thread não aguarda mais que o thread seja iniciado, e não insere mais tantas
camadas de chamadas de função entre a biblioteca C subjacente _beginthreadex e o objeto fornecido que
pode ser chamado. Anteriormente std::thread , colocamos seis funções entre _beginthreadex o e o objeto
https://software.intel.com/sites/landingpage/IntrinsicsGuide/#!=undefined&techs=SVML
C++ IDE
Suporte de Live Share para C++Suporte de Live Share para C++
IntelliCode paraC++IntelliCode paraC++
Vi su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1V i su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1
IntelliSense de modeloIntelliSense de modelo
Nova experiência de janela iniciarNova experiência de janela iniciar
chamável fornecido. Esse número foi reduzido para apenas três, dois dos quais são apenas std::invoke .
Essa alteração também resolve um bug de tempo obscuro, onde um std::thread Construtor deixaria de
responder se o relógio do sistema fosse alterado no momento exato em std::thread que estava sendo
criado.
Correção de uma regressão de desempenho em std::hash que introduzimos ao implementar
std::hash<std::filesystem::path> .
A biblioteca padrão usa destruidores em vez de blocos catch em diversos lugares para chegar à exatidão.
Essa alteração resulta em melhor interação do depurador: exceções que você joga pela biblioteca padrão
nos locais afetados agora aparecem como sendo geradas de seu site de lançamento original, em vez de
nossa Rethrow. Nem todos os blocos de captura de biblioteca padrão foram eliminados. Esperamos que o
número de blocos catch seja reduzido em versões posteriores do MSVC.
O gerador de código abaixo do ideal em std::bitset causado por um lançamento condicional em uma
função noexcept foi corrigido pela fatoração do caminho de lançamento.
A família std::list e std::unordered_* usa iteradores de não depuração internamente em mais locais.
Vários membros std::list foram alterados para reutilizar os nós da lista onde possível, em vez de
desalocá-los e realocá-los. Por exemplo, considerando list<int> que já tenha um tamanho de 3, uma
chamada para assign(4, 1729) agora substitui o ints nos três primeiros nós da lista e aloca um novo nó de
lista com o valor 1729.
Todas as chamadas da biblioteca padrão para erase(begin(), end()) foram alteradas para clear() .
Agora, std::vector inicializa e apaga os elementos com mais eficiência em determinados casos.
Melhorias em std::variant para torná-lo mais adequado para otimizadores, resultando na geração de
códigos melhores. O inlining de código agora está agora muito melhor com std::visit .
Agora, o Live Share dá suporte a C++, permitindo que desenvolvedores usem o Visual Studio ou o Visual Studio
Code para colaborar em tempo real. Para obter mais informações, consulte anunciando o Live share para C++:
Real-Time compartilhamento e colaboração
O IntelliCode usa seu próprio treinamento extensivo e seu contexto de código para colocar o que você mais
provavelmente usará na parte superior da sua lista de conclusão. Frequentemente, ele é capaz de eliminar a
necessidade de rolar para baixo na lista. Para C++, o IntelliCode oferece a maior ajuda quando você está usando
bibliotecas populares como a biblioteca padrão. IntelliCode é uma extensão opcional disponível como um
componente de carga de trabalho no instalador. Para obter mais informações, consulte Sugestões de
preenchimento de código auxiliadas por IA para C++ usando IntelliCode.
A Barra de ModeloBarra de Modelo agora utiliza a interface do usuário de Janela de InspeçãoJanela de Inspeção em vez de uma janela modal, dá
suporte a modelos aninhados e pré-popula eventuais argumentos padrão na Janela de InspeçãoJanela de Inspeção. Para obter
mais informações, veja Melhorias de IntelliSense de modelo para Visual Studio 2019 versão prévia 2. Uma lista
suspensa Usados recentementeUsados recentemente na Barra de ModeloBarra de Modelo permite alternar rapidamente entre conjuntos anteriores
de argumentos de exemplo.
Ao iniciar o IDE, uma nova janela inicial é exibida. Ele tem opções para abrir projetos recentes, clonar código do
https://docs.microsoft.com/pt-br/visualstudio/liveshare/
https://devblogs.microsoft.com/cppblog/cppliveshare/
https://devblogs.microsoft.com/cppblog/cppintellicode/
https://devblogs.microsoft.com/cppblog/template-intellisense-improvements-for-visual-studio-2019-preview-2/
Novos nomes para alguns modelos de projetoNovos nomes para alguns modelos de projeto
Diversos aprimoramentos de produtividadeDiversos aprimoramentos de produtividade
Melhorias de Informações RápidasMelhorias de Informações Rápidas
Vi su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1V i su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1
IntelliCode disponível na carga de trabalho do C++IntelliCode disponível na carga de trabalho do C++
Vi su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1V i su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1
Suporte para CMake
controle do código-fonte, abrir código local como uma solução ou uma pasta ou criar um novo projeto. A caixa de
diálogo Novo Projeto também foi aprimorada para uma experiência de pesquisa que pode ser filtrada.
Modificamos vários nomes e descrições de modelo de projeto de acordo com a caixa de diálogo Novo Projeto
atualizada.
O Visual Studio 2019 inclui os seguintes recursos que o ajudarão a tornar a codificação mais fácil e intuitiva:
Correções rápidas para:
Informações rápidas para um bloco passando o mouse sobre a chave de fechamento
Espiar Cabeçalho / Arquivo de Código
Ir para Definição em #include abre o arquivo
Adicionar #include ausentes
NULL para nullptr
Adicionar ponto e vírgula ausente
Resolver namespace ou escopo ausente
Substituir operandos de indireção inválidos (* para & e & para *)
Para obter mais informações, veja Aprimoramentos de produtividade do C++ no Visual Studio 2019 Versão Prévia
2.
A dica de ferramenta Informações Rápidas agora respeita a colorização semântica do seu editor. Ela também
apresenta um novo link para Pesquisa OnlinePesquisa Online , que pesquisará documentos online que traga mais informações
sobre o constructo de código focalizado. O link fornecido pelas informações rápidas para código vermelho-
ondulado procurará o erro online. Dessa forma, você não precisa digitar a mensagem novamente no navegador.
Para obter mais informações, consulte melhorias de informações rápidas no Visual Studio 2019: colorização e
pesquisa online.
O IntelliCode agora é fornecido como um componente opcional na carga de trabalho Desenvolvimento paraDesenvolvimento para
desktop com C++desktop com C++. Para saber mais, confira IntelliCode aprimorado para C++ agora vem com o Visual Studio
2019.
Suporte para CMake 3.14
O Visual Studio agora pode abrir caches do CMake existentes gerados por ferramentas externas, como o
CMakeGUI, ou por sistemas de metabuild personalizados ou scripts de build que invocam cmake.exe eles
mesmos.
Desempenho aprimorado de IntelliSense.
Um novo editor de configurações fornece uma alternativa para editar o arquivo CMakeSettings.json
manualmente e oferece alguma paridade com CMakeGUI.
O Visual Studio ajuda a impulsionar o desenvolvimento de C++ com o CMake no Linux, detectando se você
tem uma versão compatível do CMake em seu computador Linux. Caso contrário, ele oferece instalá-lo
para você.
As incompatibilidades de configuração no CMakeSettings, como arquiteturas incompatíveis ou
https://devblogs.microsoft.com/cppblog/c-productivity-improvements-in-visual-studio-2019-preview-2/https://devblogs.microsoft.com/cppblog/quick-info-improvements-in-visual-studio-2019-colorization-and-search-online/
https://devblogs.microsoft.com/cppblog/improved-c-intellicode-now-ships-with-visual-studio-2019/
Vi su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1V i su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1
Linux e o Subsistema do Windows para Linux
Vi su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1V i su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1
Integração de IncrediBuild
Depuração
Desenvolvimento da Área de Trabalho do Windows com C++
configurações incompatíveis do gerador de CMake, mostram linhas irregulares no editor JSON e erros na
Lista de Erros.
A cadeia de ferramentas do vcpkg é detectada automaticamente e habilitada para projetos do CMake que
são abertos no IDE após vcpkg integrate install ser executado. Esse comportamento pode ser desativado
especificando-se um arquivo de cadeia de ferramentas vazio no CMakeSettings.
Projetos do CMake agora permitem depuração Apenas Meu Código por padrão.
Os avisos de análise estática agora são processados em segundo plano e exibidos no editor para projetos
CMake.
Mensagens 'begin' e 'end' mais claras de build e de configuração para projetos do CMake e suporte à
interface do usuário de progresso do build do Visual Studio. Além disso, agora há uma configuração de
detalhes de CMake em Ferramentas > OpçõesFerramentas > Opções para personalizar o nível de detalhe das mensagens de
build e configuração do CMake na Janela de Saída.
A configuração cmakeToolchain agora é compatível com o CMakeSettings.json para especificar cadeias de
ferramentas sem modificar manualmente a linha de comando do CMake.
Um novo atalho de menu Compilar Tudo****Ctr l + Shift + BCompilar Tudo****Ctr l + Shift + B.
Suporte integrado para edição, compilação e depuração de projetos CMake com Clang/LLVM. Para saber mais,
veja Suporte a Clang/LLVM no Visual Studio.
Suporte para AddressSanitizer (ASan) em projetos de plataforma cruzada do Linux e CMake. Para saber
mais, confira AddressSanitizer (ASan) para carga de trabalho do Linux no Visual Studio 2019.
Suporte integrado do Visual Studio para uso de C++ com o subsistema Windows para Linux (WSL). Para
saber mais, confira C++ com Visual Studio 2019 e subsistema Windows para Linux (WSL).
O IncrediBuild foi incluído como um componente opcional na carga de trabalho Desenvolvimento paraDesenvolvimento para
desktop com C++desktop com C++. O Monitor de Compilação do IncrediBuild foi totalmente integrado no IDE do Visual Studio.
Para obter mais informações, consulte Visualizar sua compilação com o monitor de compilação do IncrediBuild e o
Visual Studio 2019.
Para aplicativos C++ em execução no Windows, os arquivos PDBs agora são carregados em um processo
separado de 64 bits. Essa alteração resolve uma variedade de falhas causadas pelo depurador com
memória insuficiente. Por exemplo, ao depurar aplicativos que contêm um grande número de módulos e
arquivos PDB.
A pesquisa está habilitada nas janelas InspeçãoInspeção , AutosAutos e LocaisLocais .
Estes assistentes do C++ ATL/MFC não estão mais disponíveis:
Assistente de componente de COM+ 1.0 da ATL
Assistente do componente Active Server Page da ATL
Assistente de provedor OLE DB da ATL
https://devblogs.microsoft.com/cppblog/clang-llvm-support-in-visual-studio/
https://github.com/google/sanitizers/wiki/AddressSanitizer
https://devblogs.microsoft.com/cppblog/addresssanitizer-asan-for-the-linux-workload-in-visual-studio-2019/
https://devblogs.microsoft.com/cppblog/c-with-visual-studio-2019-and-windows-subsystem-for-linux-wsl/
https://devblogs.microsoft.com/cppblog/visualize-your-build-with-incredibuilds-build-monitor-and-visual-studio-2019/
Desenvolvimento móvel com C++ (Android e iOS)
Conjunto de ferramentas de plataforma Clang/C2
Análise de código
Vi su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1V i su a l St u d i o 2 0 1 9 v e r sã o 1 6 .1
Teste de unidade
Assistente de página de propriedades da ATL
Assistente de consumidor OLE DB da ATL
Consumidor ODBC do MFC
Classe MFC em Controle ActiveX
Classe MFC em TypeLib.
O código de exemplo para essas tecnologias está arquivado em Microsoft Docs e no repositório GitHub
VCSamples.
O SDK (Software Development Kit) do Windows 8.1 não está mais disponível no instalador do Visual
Studio. Recomendamos atualizar seus projetos em C++ para o SDK do Windows 10 mais recente. Se você
tiver uma dependência forte no 8.1, poderá baixá-la do arquivo do SDK do Windows.
O direcionamento do Windows XP não estará mais disponível para o conjunto de ferramentas do C++
mais recente. O direcionamento do XP com bibliotecas e o compilador MSVC no nível do VS 2017 ainda é
compatível e pode ser instalado por meio de "Componentes individuais".
Nossa documentação desencoraja ativamente o uso de módulos de mesclagem para a implantação do
Runtime do Visual C++. Estamos realizando, nesta versão, a etapa extra de marcar nossos MSMs como
preteridos. Considere migrar sua implantação central do VCRuntime de MSMs para o pacote redistribuível.
A experiência do Android C++ agora usa por padrão o SDK do Android 25 e o NDK do Android 16b.
O componente experimental Clang/C2 foi removido. Use o conjunto de ferramentas do MSVC para conformidade
total de padrões C++ com /permissive- e /std:c++17 ou a cadeia de ferramentas Clang/LLVM para Windows.
A análise de código agora é executada automaticamente em segundo plano. Avisos são exibidos como
linhas irregulares verdes no editor conforme você digita. Para obter mais informações, consulte Análise de
código no editor no Visual Studio 2019 Versão Prévia 2.
Novas regras experimentais de ConcurrencyCheck para tipos de biblioteca padrão conhecidos do <mutex>
cabeçalho. Para obter mais informações, consulte Análise de código de simultaneidade no Visual Studio
2019.
Uma implementação parcial atualizada do Verificador de perfil de tempo de vida, que detecta referências e
ponteiros pendentes. Para obter mais informações, consulte Atualização de perfil de tempo de vida no
Visual Studio 2019 Versão Prévia 2.
Mais verificações relacionadas à corrotina, incluindo C26138, C26810, C26811 e a regra experimental
C26800. Para obter mais informações, consulte Novas verificações de análise de código no Visual Studio
2019: uso após movimentação e corrotina.
Novas correções rápidas para verificações de variável não inicializadas. Para saber mais, confira Novas
correções rápidas de análise de código para memória não inicializada (C6001) e avisos de uso antes da
inicialização (C26494).
O modelo de projeto de teste do C++ gerenciado não está mais disponível. Você pode continuar usando a
https://devblogs.microsoft.com/cppblog/in-editor-code-analysis-in-visual-studio-2019-preview-2/
https://devblogs.microsoft.com/cppblog/concurrency-code-analysis-in-visual-studio-2019/
https://herbsutter.com/2018/09/20/lifetime-profile-v1-0-posted/
https://devblogs.microsoft.com/cppblog/lifetime-profile-update-in-visual-studio-2019-preview-2/
https://devblogs.microsoft.com/cppblog/new-code-analysis-checks-in-visual-studio-2019-use-after-move-and-coroutine/
https://devblogs.microsoft.com/cppblog/new-code-analysis-quick-fixes-for-uninitialized-memory-c6001-and-use-before-init-c26494-warnings/
Compilador do Visual Studio 2017 C++
Aprimoramentos de conformidade do C++Aprimoramentos de conformidade do C++
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .8Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .8
Novas opções do compiladorNovas opções do compilador
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
estrutura de teste do C++ gerenciado em seus projetos existentes. Para novos testes de unidade, considere usar
uma das estruturas de testenativas para as quais o Visual Studio fornece modelos (MSTest, Google Test) ou o
modelo de projeto de teste de C# gerenciado.
N ovidades de C++ no Visual Studio
O Visual Studio 2017 traz muitas atualizações e correções para o ambiente do C++. Corrigimos mais de 250 bugs
e relataram problemas no compilador e nas ferramentas. Muitos foram enviados por clientes por meio do
relatório de um problema e fornecem uma sugestão de opções em enviar comentár iosenviar comentár ios . Obrigado por relatar
bugs! Para saber mais sobre todas as novidades do Visual Studio, visite Novidades no Visual Studio 2017. Para
saber mais sobre novidades de C++ no Visual Studio 2019, confira . Para saber mais sobre as novidades de C++
no Visual Studio 2015 e em versões anteriores, confira O que há de novo no Visual C++ de 2003 a 2015.
Atualizamos o compilador C++ e a biblioteca padrão nesta versão com suporte aprimorado para os recursos C++
11 e C++ 14. Ele também inclui suporte preliminar para determinados recursos que devem estar no padrão C++
17. Para obter informações detalhadas, consulte Aprimoramentos de conformidade do C++ no Visual Studio
2017.
O compilador dá suporte a cerca de 75% dos recursos que são novos no C++ 17, incluindo associações
estruturadas, constexpr lambdas, if constexpr variáveis embutidas, expressões de dobra e adição noexcept ao
sistema de tipos. Esses recursos estão disponíveis na /std:c++17 opção. Para obter mais informações, consulte
melhorias de conformidade do C++ no Visual Studio 2017
Agora, o conjunto de ferramentas do compilador do MSVC no Visual Studio versão 15.7 é compatível com o
padrão do C++. Para obter mais informações, consulte anunciando: MSVC está em conformidade com a
compatibilidade de linguagem C++ Standard e Microsoft C++.
A /experimental:preprocessor opção de compilador habilita o novo pré-processador de MSVC experimental que,
eventualmente, estará em conformidade com todos os padrões de C e C++ aplicáveis. Para obter mais
informações, consulte visão geral do MSVC New pré-processador.
/permissive- : Habilite todas as opções de compilador de conformidade de padrões estritos e desabilite a
maioria das extensões de compilador específicas da Microsoft (mas não __declspec(dllimport) , por
exemplo). Essa opção está ativada por padrão no Visual Studio 2017 versão 15.5. O /permissive- modo de
conformidade inclui suporte para pesquisa de nome de duas fases. Para obter mais informações, consulte
melhorias de conformidade do C++ no Visual Studio.
/diagnostics : Habilita a exibição do erro de diagnóstico ou local de aviso de três maneiras diferentes:
apenas o número de linha, o número de linha e a coluna, ou o número de linha e coluna, com um cursor
sob a linha de código incorreto.
/debug:fastlink : Habilite até 30% mais rápido de tempo de link incremental (vs. Visual Studio 2015), não
copiando todas as informações de depuração no arquivo PDB. Em vez disso, o arquivo PDB aponta para as
informações de depuração para os arquivos de biblioteca e de objeto usados para criar o executável.
Consulte ciclo de compilação C++ mais rápido em vs "15 /Debug:fastlink " com e recomendações para
acelerar as compilações do C++ no Visual Studio.
O Visual Studio 2017 permite usar /sdl com /await . Removemos a /RTC limitação com corrotinas.
/std:c++14 e /std:c++latest : essas opções de compilador permitem que você aceite versões específicas
da linguagem de programação ISO C++ em um projeto. A maioria dos novos recursos padrão de rascunho
https://docs.microsoft.com/pt-br/visualstudio/ide/how-to-report-a-problem-with-visual-studio?view=vs-2017&preserve-view=true
https://docs.microsoft.com/pt-br/visualstudio/ide/whats-new-visual-studio-2017?view=vs-2017&preserve-view=true
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-what-s-new-2003-through-2015
https://devblogs.microsoft.com/cppblog/announcing-msvc-conforms-to-the-c-standard/
https://docs.microsoft.com/pt-br/cpp/build/reference/experimental-preprocessor
https://docs.microsoft.com/pt-br/cpp/preprocessor/preprocessor-experimental-overview
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://docs.microsoft.com/pt-br/cpp/build/reference/diagnostics-compiler-diagnostic-options
https://docs.microsoft.com/pt-br/cpp/build/reference/debug-generate-debug-info
https://devblogs.microsoft.com/cppblog/faster-c-build-cycle-in-vs-15-with-debugfastlink/
https://devblogs.microsoft.com/cppblog/recommendations-to-speed-c-builds-in-visual-studio/
https://docs.microsoft.com/pt-br/cpp/build/reference/sdl-enable-additional-security-checks
https://docs.microsoft.com/pt-br/cpp/build/reference/await-enable-coroutine-support
https://docs.microsoft.com/pt-br/cpp/build/reference/rtc-run-time-error-checks
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
Geração de código, segurança, diagnóstico e controle de versãoGeração de código, segurança, diagnóstico e controle de versão
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
é protegida pela /std:c++latest opção.
/std:c++17 habilita o conjunto de recursos C++ 17 implementados pelo compilador. Esta opção desabilita
o suporte do compilador e da biblioteca padrão para recursos após C++ 17: aqueles que são alterados ou
novos em versões posteriores do rascunho de trabalho e atualizações de defeito do padrão C++. Para
habilitar esses recursos, use /std:c++latest .
Esta versão apresenta várias melhorias na otimização, na geração de código, no controle de versão do conjunto de
ferramentas e nos diagnósticos. Alguns aprimoramentos importantes incluem:
Melhor geração de código de loops: suporte para vetorização automática da divisão de inteiros constantes,
melhor identificação de padrões de memset.
Segurança de código aprimorada: emissão aprimorada de diagnóstico de compilador de saturação de buffer e
/guard:cf agora protege instruções de switch que geram tabelas de salto.
Controle de versão: o valor da macro de pré-processador interna _ MSC _ Ver_ MSC _ Ver agora está sendo atualizado de
forma monotônico em cada atualização de conjunto de ferramentas Visual C++. Para obter mais informações,
consulte Versão do compilador do Visual C++.
Novo layout do conjunto de ferramentas: o compilador e as ferramentas de build relacionadas têm um novo
local e nova estrutura de diretório em seu computador de desenvolvimento. O novo layout habilita instalações
lado a lado de várias versões do compilador. Para saber mais, confira Layout de ferramentas do compilador no
Visual Studio 2017.
Diagnósticos aprimorados: a janela de saída agora mostra a coluna em que ocorre um erro. Para obter mais
informações, consulte melhorias do diagnóstico do compilador do C++ em vs "15" Preview 5.
Ao usar corrotinas, a palavra-chave experimental yieldyield (disponível na /await opção) foi removida. Em vez
disso, seu código deve ser atualizado para usar co_yield . Para obter mais informações, consulte yield
palavra-chave para se tornar co_yield em vs 2017.
Aprimoramentos adicionais para o diagnóstico no compilador. Para saber mais, confira Aperfeiçoamentos de
diagnóstico no Visual Studio 2017 15.3.0.
Visual C++ o desempenho do tempo de execução continua a melhorar por meio da melhor qualidade de código
gerada. Agora você pode simplesmente recompilar o código e o aplicativo será executado mais rapidamente.
Algumas das otimizações do compilador são totalmente novas, como a vetorização de repositórios escalares
condicionais, a combinação de chamadas sin(x) e cos(x) em um novo sincos(x) e a eliminação de instruções
redundantes do otimizador de SSA. Outras otimizações de compilador são melhorias na funcionalidade existente,
como a heurística vetorizadorautomático para expressões condicionais, otimizações de loop melhores e CodeGen
flutuante mín/máx. O vinculador tem uma implementação nova e mais rápida /OPT:ICF , que pode resultar em
até 9% de aumentos de tempo de vinculação, e há outras correções de desempenho na vinculação incremental.
Para obter mais informações, consulte /OPT (Otimizações) e /INCREMENTAL (Vincular de maneira incremental).
O compilador do Microsoft C++ dá suporte ao AVX-512 da Intel. Ele tem instruções de comprimento de vetor que
trazem novas funções em AVX-512 a registros de largura de 128 bits e 256 bits.
A opção /Zc: noexceptTypes- pode ser usada para reverter para a versão c++ 14 do noexcept ao usar o modo
c++ 17 em geral. Essa opção permite que você atualize seu código-fonte para estar em conformidade com a
C++17 sem precisar reescrever todo o código throw() ao mesmo tempo. Para obter mais informações, consulte
Remoção de especificação de exceção dinâmica e noexcept.
Novo compilador switch /Qspectre para ajudar a mitigar contra ataques de canal lateral de execução
especulativa. Para obter mais informações, consulte mitigações Spectre em MSVC.
Novo aviso de diagnóstico da mitigação do Spectre. Para saber mais, confira Diagnóstico do Spectre no Visual
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/guard-enable-control-flow-guard
https://devblogs.microsoft.com/cppblog/visual-c-compiler-version/
https://devblogs.microsoft.com/cppblog/compiler-tools-layout-in-visual-studio-15/
https://devblogs.microsoft.com/cppblog/c-compiler-diagnostics-improvements-in-vs-15-rc/
https://devblogs.microsoft.com/cppblog/yield-keyword-to-become-co_yield-in-vs-2017/
https://devblogs.microsoft.com/cppblog/diagnostic-improvements-in-vs2017-15-3-0/
https://docs.microsoft.com/pt-br/cpp/build/reference/opt-optimizations
https://docs.microsoft.com/pt-br/cpp/build/reference/incremental-link-incrementally
https://docs.microsoft.com/pt-br/cpp/build/reference/zc-noexcepttypes
https://docs.microsoft.com/pt-br/cpp/build/reference/qspectre
https://devblogs.microsoft.com/cppblog/spectre-mitigations-in-msvc/
https://devblogs.microsoft.com/cppblog/spectre-diagnostic-in-visual-studio-2017-version-15-7-preview-4/
Biblioteca padrão C++
Melhorias de correçãoMelhorias de correção
Vi su a l St u d i o 2 0 1 7 R T M (v e r sã o 1 5 .0 )V i su a l St u d i o 2 0 1 7 R T M (v e r sã o 1 5 .0 )
V i su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Studio 2017 versão 15.7 versão prévia 4.
Um novo valor para/ZC, /Zc:__cplusplus , permite a emissão de relatórios corretos do suporte standard do
C++. Por exemplo, quando a opção é definida e o compilador está no /std:c++17 modo, o valor expande para
201703L . Para saber mais, confira Agora o MSVC relata corretamente __cplusplus.
Melhorias de diagnóstico secundárias basic_string _ITERATOR_DEBUG_LEVEL != 0 . Quando uma verificação de
IDL é ultrapassada em uma máquina de cadeia de caracteres, ela agora relatará o comportamento específico
que causou a viagem. Por exemplo, em vez de "não é possível desreferenciar o iterador de cadeia de
caracteres", você verá "não é possível desreferenciar o iterador de cadeia de caracteres porque ele está fora do
intervalo (por exemplo, um iterador de fim)".
O operador de atribuição de mudança std::promise foi corrigido, pois anteriormente poderia causar bloqueio
indefinido no código.
Erros de compilador corrigidos, com a conversão implícita de atomic<T*> em T* .
pointer_traits<Ptr> agora detecta Ptr::rebind<U> corretamente.
Foi corrigido um const qualificador ausente no move_iterator operador de subtração.
Corrigido o gerador de código inválido silencioso para alocadores definidos pelo usuário com estado
solicitando propagate_on_container_copy_assignment e propagate_on_container_move_assignment .
atomic<T> agora tolera o operator&() sobrecarregado.
Pequena melhoria no diagnóstico do compilador para chamadas bind() incorretas.
Há mais melhorias na biblioteca Standard no Visual Studio 2017 RTM. Para obter uma lista completa, consulte a
entrada de blog da equipe do C++ correções de biblioteca padrão no VS 2017 RTM.
Os contêineres da biblioteca padrão agora fixam o max_size() ao numeric_limits<difference_type>::max() em
vez do max() de size_type . Essa alteração garante que o resultado de distance() nos iteradores do
contêiner seja representável no tipo de retorno de distance() .
Especialização auto_ptr<void> ausente corrigida.
Os for_each_n() generate_n() algoritmos,, e search_n() anteriormente não puderam ser compilados se o
argumento de comprimento não era um tipo integral. Agora, eles tentam converter comprimentos não-
integral para os iteradores difference_type .
normal_distribution<float> não emite mais avisos na biblioteca padrão sobre o estreitamento de double para
float.
Corrigidas algumas operações basic_string que usavam npos em vez de max_size() durante a verificação
de estouro de tamanho máximo.
condition_variable::wait_for(lock, relative_time, predicate) aguardaria o tempo relativo inteiro se houvesse
uma ativação falsa. Agora ele aguarda apenas um único intervalo do tempo relativo.
future::get() agora invalida o future , como o padrão exige.
iterator_traits<void *> era um erro de hardware porque tentava formar void& ; agora claramente torna-se
um struct vazio para permitir o uso de iterator_traits em condições SFINAE "is iterator".
Alguns avisos relatados por Clang -wsystem-Headers-wsystem-Headers foram corrigidos.
Também corrigido "a especificação de exceção na declaração não corresponde à declaração anterior" relatada
por Clang -Wmicrosoft-Exception-spec-Wmicrosoft-Exception-spec.
Também corrigidos os avisos de ordenação mem-initializer-list relatados por Clang e C1XX.
Os contêineres não ordenados não trocavam funções de hash ou predicados quando os próprios contêineres
eram trocados. Agora eles fazem isso.
https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
https://devblogs.microsoft.com/cppblog/stl-fixes-in-vs-2017-rtm/
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Aprimoramentos de conformidadeAprimoramentos de conformidade
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Muitas operações de permuta de contêiner agora estão marcadas noexcept ( já que nossa biblioteca padrão
nunca pretende lançar uma exceção ao detectar a condição de propagate_on_container_swap comportamento
indefinido não-igual ao alocador não-EQUAL).
Muitas vector<bool> operações agora estão marcadas noexcept .
A biblioteca padrão agora imporá o alocador de correspondência value_type (no modo C++17) com uma
hachura de escape de recusa.
Corrigidas algumas condições em que self-range-insert em basic_string misturaria o conteúdo das cadeias
de caracteres. (Observação: self-range-insert em vectors ainda é proibido pelo Standard.)
basic_string::shrink_to_fit() não é mais afetado pelo propagate_on_container_swap do alocador.
std::decay Agora lida com tipos de função Abominable, ou seja, tipos de função que são qualificados por CV,
são qualificadas para referência ou ambos.
Alteradas as diretivas de inclusão para usar diferenciação adequada de maiúsculas e minúsculas e barras
invertidas, melhorando a portabilidade.
Corrigido o aviso C4061 "enumerador ' enumerador ' na opção de enumeração ' enumeração ' não é
manipulado explicitamente por um rótulo case". Esse aviso é desativado por padrão e foi corrigido como uma
exceção à política geral da biblioteca padrão para avisos. (A biblioteca padrão está /W4 limpa, mas não tenta
ser /Wall limpa. Muitos avisos desativados por padrão são com ruído incomum e não se destinam a serem
usados regularmente.)
Melhoria nas verificações de depuração de std::list . Os iteradoresde lista agora verificam operator->() e
list::unique() agora marca os iteradores como invalidados.
Corrigida a metaprogramação de uses-allocator em tuple .
std::partition Agora chama os tempos de predicado N em vez de N + 1 vezes, conforme o padrão exige.
As tentativas de evitar estáticas mágicas na versão 15.3 foram reparadas na versão 15.5.
std::atomic<T> não requer mais que T seja construível por padrão.
Algoritmos de heap que levam tempo logarítmica se comportam de forma diferente quando a depuração do
iterador está habilitada Eles não fazem mais uma asserção de tempo linear de que a entrada é, na verdade, um
heap.
__declspec(allocator) agora é protegido apenas para C1XX a fim de evitar avisos do Clang que não entendem
esse declspec.
basic_string::npos agora está disponível como uma constante de tempo de compilação.
std::allocator no modo C++ 17 agora lida corretamente com a alocação de tipos alinhados por excesso, ou
seja, tipos cujo alinhamento é maior que max_align_t , a menos que seja desabilitado pelo /Zc:alignedNew- .
Por exemplo, vetores de objetos com alinhamento de 16 ou de 32 bytes agora serão corretamente alinhados
para instruções SSE e AVX.
Adicionamos <any> , <string_view> , apply() , make_from_tuple() .
Adicionado <optional> , <variant> , e shared_ptr::weak_type <cstdalign> .
Habilitado C++ 14 constexpr em min(initializer_list) , max(initializer_list) , e,
minmax(initializer_list) e min_element() , e max_element() minmax_element() .
Para obter mais informações, consulte tabela de conformidade da linguagem Microsoft C++.
Vários recursos adicionais do C++17 foram implementados. Para obter mais informações, consulte tabela de
conformidade da linguagem Microsoft C++.
Implementado P0602R0 "variante e opcional devem propagar a trivialidade copiar/mover".
A biblioteca padrão agora oficialmente tolera RTTI dinâmico sendo desabilitado por meio da opção /GR-.
dynamic_pointer_cast() E rethrow_if_nested() dynamic_cast , de forma inerente, exigem, portanto, a
https://docs.microsoft.com/pt-br/cpp/build/reference/gr-enable-run-time-type-information
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
biblioteca padrão agora as marca como =delete sob /GR- .
Mesmo quando o RTTI dinâmico foi desabilitado via /GR- , "RTTI estático" na forma de typeid(SomeType) ainda
está disponível e alimenta vários componentes de biblioteca padrão. A biblioteca padrão agora também dá
suporte à desabilitação desse recurso, por meio do /D_HAS_STATIC_RTTI=0 . Esse sinalizador também
desabilitará std::any , as funções membro target() e target_type() de std::function e a função membro
amigável get_deleter() de std::shared_ptr e de std::weak_ptr .
A biblioteca padrão agora usa C++ 14 constexpr incondicionalmente, em vez de macros definidas
condicionalmente.
A biblioteca padrão agora usa modelos de alias internamente.
A biblioteca padrão agora usa nullptr internamente, em vez de nullptr_t{} . (O uso interno de NULL foi
erradicado. O uso interno de 0-as-null está sendo eliminado gradualmente.)
A biblioteca padrão agora usa std::move() internamente, em vez de usar std::forward() de maneira
estilística indevidamente.
static_assert(false, "message") foi alterado por #error message . Essa alteração melhora o diagnóstico do
compilador porque #error interrompe imediatamente a compilação.
A biblioteca padrão não marca mais funções como __declspec(dllimport) . A tecnologia moderna de
vinculador não exige mais isso.
SFINAE extraído para argumentos de modelo padrão, o que reduzia a desordem em comparação com tipos de
retorno e tipos de argumento de função.
As verificações de depuração no <random> agora usam a maquina comum da biblioteca padrão, em vez da
função interna _Rng_abort() , que é chamada fputs() de stderrstderr . A implementação dessa função foi mantida
para compatibilidade binária. Vamos removê-lo na próxima versão incompatível binária da biblioteca padrão.
Vários recursos de biblioteca padrão foram adicionados, substituídos ou removidos de acordo com o padrão
C++ 17. Para obter mais informações, consulte melhorias de conformidade do C++ no Visual Studio.
Suporte experimental para os seguintes algoritmos paralelos:
As assinaturas para os seguintes algoritmos paralelos são adicionadas, mas não são paralelizadas no
momento. A criação de perfil mostrou nenhum benefício em paralelizar algoritmos que só movem ou
permutam elementos:
all_of
any_of
for_each
for_each_n
none_of
reduce
replace
replace_if
sort
copy
copy_n
fill
fill_n
move
reverse
reverse_copy
rotate
rotate_copy
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .6Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .6
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Correções de desempenho e taxa de transferênciaCorreções de desempenho e taxa de transferência
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
swap_ranges
<memory_resource>
Princípios básicos da biblioteca V1
Exclusão da atribuição polymorphic_allocator
Melhorias na dedução de argumento de modelo de classe
Suporte a algoritmos paralelos não é mais experimental
Uma nova implementação de <filesystem>
Conversões elementares de cadeia de caracteres (parcial)
std::launder()
std::byte
hypot(x,y,z)
Evitar decaimento desnecessário
Funções matemáticas especiais
constexpr char_traits
Guias de dedução da biblioteca padrão
Para obter mais informações, consulte tabela de conformidade da linguagem Microsoft C++.
Fez sobrecargas basic_string::find(char) chamar traits::find apenas uma vez. Anteriormente, isso era
implementado como uma pesquisa de cadeia de caracteres geral para de uma cadeia de caracteres de
comprimento 1.
basic_string::operator== agora verifica o tamanho da cadeia de caracteres antes de comparar o conteúdo das
cadeias de caracteres.
Removido o acoplamento de controle em basic_string , que dificultava a análise do otimizador do compilador.
Para todas as cadeias de caracteres curtas, chamar reserve ainda não tem certo custo por não fazer nada.
std::vector foi revisado quanto à exatidão e ao desempenho: a alias durante as operações de inserção e
emplace agora é manipulado corretamente conforme exigido pelo padrão, a garantia de exceção forte agora é
fornecida quando exigido pelo padrão por meio de move_if_noexcept() e outra lógica, e INSERT e emplace
fazem menos operações de elementos.
A biblioteca padrão do C++ agora evita desreferenciar ponteiros nulos sofisticados.
Desempenho de weak_ptr::lock() aprimorado.
Para aumentar a taxa de transferência do compilador, os cabeçalhos da biblioteca padrão do C++ agora evitam
incluir declarações para intrínsecos do compilador que são desnecessários.
Aumento mais de três vezes do desempenho dos construtores de movimento std::string e std::wstring .
Contratamos de interações com noexcept o, que impedia o inalinhamento da std::atomic implementação em
funções que usam SEH (manipulação de exceção estruturada).
Alterada a função interna _Deallocate() da biblioteca padrão para ser otimizada em código menor, permitindo
que ele seja embutido em outros locais.
Alterado std::try_lock() para usar a expansão de pacote em vez de recursão.
O algoritmo de impedimento de deadlock std::lock() foi melhorado para usar operações lock() em vez de
girar em try_lock() em todos os bloqueios.
Habilitada a otimização de valor retornado nomeado em system_category::message() .
conjunction e disjunction agora instanciam N + 1 tipos, em vez de 2N + 2 tipos.
std::function não instancia mais máquinas de suporte de alocador para cada chamável apagado por tipo,
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
melhorando a taxa de transferência e reduzindo o tamanho de .obj em programas que passam vários lambdas
distintospara std::function .
allocator_traits<std::allocator> contém operações std::allocator manualmente embutidas, o que reduz o
tamanho do código que interage com std::allocator apenas por meio de allocator_traits (ou seja, no
maioria dos códigos).
A interface de alocador mínima C++11 agora é manipulada pela biblioteca padrão chamando
allocator_traits diretamente, em vez de encapsular o alocador em uma classe interna _Wrap_alloc . Isso
reduz o tamanho do código gerado compatível com o alocador, melhora a capacidade do otimizador de
raciocinar sobre contêineres da Biblioteca Padrão em alguns casos e fornece uma melhor experiência de
depuração (porque agora você pode ver o tipo de alocador, em vez de _Wrap_alloc<your_allocator_type> no
depurador).
Foi removida a metaprogramação para personalizada allocator::reference , que os alocadores não têm
permissão para personalizar. (Os alocadores podem fazer contêineres usarem ponteiros sofisticados, mas não
referências sofisticadas.)
O front-end do compilador foi ensinado a descompactar iteradores de depuração em loops for baseados em
intervalo, melhorando o desempenho de compilações de depuração.
O caminho de redução interna de basic_string para shrink_to_fit() e para reserve() não está mais no
caminho das operações de realocação, o que reduz o tamanho do código para todos os membros de mutação.
O caminho de crescimento interno basic_string não está no caminho de shrink_to_fit() .
As operações de mutação de basic_string agora são fatoradas em funções de caminho rápido de não
alocação e de caminho lento de alocação, aumentando a probabilidade de o caso comum de não realocação
ser embutido em chamadores.
As basic_string operações de mutação agora constroem buffers realocados no estado preferencial em vez de
redimensionar em vigor. Por exemplo, uma inserção no início de uma cadeia de caracteres agora move o
conteúdo após a inserção exatamente uma vez. Ele é movido para baixo ou para o buffer recentemente
alocado. Ele não é mais movido duas vezes no caso de realocação, primeiro ao buffer alocado recentemente e,
em seguida, para baixo.
As operações que chamam a biblioteca padrão C <string> agora armazenam em cache o errno endereço
para remover a interação repetida com TLS.
Implementação is_pointer simplificada.
Concluída a alteração da expressão baseada em função SFINAE para struct e void_t -baseada.
Os algoritmos de biblioteca padrão agora evitam iteradores de pós-incrementação.
Corrigidos os avisos de truncamento ao usar alocadores de 32 bits em sistemas de 64 bits.
A atribuição de movimentação std::vector agora é mais eficiente para o caso de alocador não igual a não
POCMA reutilizando o buffer quando possível.
basic_string<char16_t> agora aciona o mesmo memcmp , memcpy e otimizações semelhantes que acionam
basic_string<wchar_t> .
Uma limitação do otimizador que impedia os ponteiros de função de serem embutidos e que foi exposta pelo
nosso trabalho "evitar a cópia de funções" no Visual Studio 2015 Atualização 3 foi solucionada, restaurando o
desempenho de lower_bound(iter, iter, function pointer) .
A sobrecarga da verificação da ordem de entradas da depuração do iterador para includes , set_difference ,
set_symmetric_difference e set_union foi reduzida desencapsulando iteradores antes de verificar a ordem.
std::inplace_merge agora ignora elementos que já estão no lugar.
Construir std::random_device agora não constrói e, em seguida, destrói um std::string .
std::equal e std::partition tinham uma passagem de otimização de jump-threading que salvava uma
comparação de iterador.
Quando for passado ponteiros em std::reverse para T facilmente copiado, ele agora enviará uma
Outras bibliotecas
Suporte à biblioteca de software livreSuporte à biblioteca de software livre
CPPRest SDK 2.9.0CPPRest SDK 2.9.0
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
ATLATL
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
runtime do Visual C++runtime do Visual C++
IDE do Visual Studio 2017 C++
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
implementação vetorizada manuscrita.
std::fill , std::equal e std::lexicographical_compare foram ensinados a enviar a memset e a memcmp para
std::byte e para gsl::byte (e outras classes de enumeração e enumerações similares a char). Como
std::copy envia usando is_trivially_copyable , ele não precisa de nenhuma alteração.
A biblioteca padrão não contém mais destruidores com chaves vazias cujo único comportamento era tornar os
tipos em não facilmente destrutíveis.
VcpkgVcpkg é uma ferramenta de linha de comando de software livre que simplifica bastante o processo de aquisição e
de compilação de bibliotecas estáticas e de DLLS de software livre do C++ no Visual Studio. Para obter mais
informações, consulte vcpkg: um gerenciador de pacotes para C++.
A CPPRestSDK, uma API da Web de plataforma cruzada para o C++, foi atualizada para a versão 2.9.0. Para obter
mais informações, consulte CppRestSDK 2.9.0 está disponível no GitHub.
Ainda outro conjunto de correções de compatibilidade de pesquisa de nome
Construtores de movimentação e operadores de atribuição existentes são agora corretamente marcados como
sem lançamento
Não suprimir aviso C4640 válido sobre a inicialização segura de thread de estatísticas locais no atlstr.h
A inicialização thread-safe de estáticas locais foi desativada automaticamente no conjunto de ferramentas do
XP ao usar a ATL para criar uma DLL. Agora não é. Você pode adicionar /Zc:threadSafeInit- as configurações
do seu projeto se não quiser a inicialização de thread-safe.
Novo cabeçalho "cfguard.h" para símbolos de proteção de fluxo de controle.
Agora, o desempenho de alteração de configuração é melhor para projetos nativos C++ e muito melhor para
projetos C++/CLI. Quando uma configuração de solução for ativada pela primeira vez, depois ela será mais
rápida, e todas as ativações subsequentes dessa configuração de solução serão quase instantâneas.
Vários assistentes de código e de projeto foram reescritos no estilo de caixa de diálogo de assinatura.
Adicionar classeAdicionar classe agora inicia o assistente de adição de classe diretamente. Todos os outros itens que estavam
anteriormente aqui agora estão disponíveis em Adicionar > Novo ItemAdicionar > Novo Item.
Os projetos Win32 agora estão sob a categoria área de trabalho do Windowsárea de trabalho do Windows na caixa de diálogo novonovo
projetoprojeto .
Agora, os modelos de aplicativos de desktopaplicativos de desktop e de console do WindowsWindows criam os projetos sem exibir um
assistente. Há um novo Assistente de Área de Trabalho do WindowsAssistente de Área de Trabalho do Windows na mesma categoria que exibe as
mesmas opções que o antigo assistente Aplicativo de Console do Win32Aplicativo de Console do Win32 .
Diversas operações C++ que usam o mecanismo IntelliSense para refatoração e navegação de código são
executadas muito mais rápido. Os números a seguir se baseiam na solução do Visual Studio Chromium com 3500
projetos:
https://docs.microsoft.com/pt-br/cpp/build/vcpkg
https://devblogs.microsoft.com/cppblog/cpprestsdk-2-9-0-is-available-on-github/
REC URSOREC URSO M EL H O RIA DE DESEM P EN H OM EL H O RIA DE DESEM P EN H O
Renomear 5.3x
Alterar assinatura 4.5x
Localizar Todas as Referências 4.7x
IntelliSense
O C++ agora é compatível com Ctrl + Clique em Ir para DefiniçãoIr para Definição , facilitando a navegação do mouse para
definições. O Visualizador de Estrutura do pacote de Ferramentas Avançadas de Produtividade agora também está
incluído no produto por padrão.
O novo mecanismo de banco de dados com base em SQLite agora está sendo usado por padrão. O novo
mecanismo acelera asoperações de banco de dados, como ir para definiçãoir para definição e Localizar todas asLocalizar todas as
referênciasreferências . Ele melhora significativamente o tempo de análise da solução inicial. A configuração foi
movida para ferramentas > opções > editor de texto > C/C++ > avançadoferramentas > opções > editor de texto > C/C++ > avançado. (Antes... C/C++ >
experimental.)
Melhoramos o desempenho do IntelliSense em projetos e arquivos que não estão usando cabeçalhos pré-
compilados – um Cabeçalho Pré-Compilado Automático será criado para os cabeçalhos no arquivo atual.
Adicionamos filtragem de erros e ajuda para erros do IntelliSense e na lista de erros. Agora, ao clicar na
coluna de erro é possível filtrar. Além disso, clicar em erros específicos ou pressionar F1 iniciará uma
pesquisa online sobre a mensagem de erro.
Adicionada a capacidade de filtrar por tipo os itens da Lista de Membros.
Adicionado um novo recurso experimental Predictive IntelliSense, que fornece filtragem ciente de contexto
daquilo que aparece na Lista de Membros. Para saber mais, confira Melhorias do IntelliSense no C++ –
https://devblogs.microsoft.com/cppblog/c-intellisense-improvements-predictive-intellisense-filtering/
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Projetos não MSBuild com Abrir Pasta
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Suporte a CMake através do Open Folder
IntelliSense Preditivo e Filtragem.
Localizar todas as referênciasLocalizar todas as referências (SHIFT + F12) agora ajuda você a se familiarizar facilmente, mesmo em
bases de código complexas. Ela fornece agrupamento, filtragem, classificação e pesquisa avançada nos
resultados e, para algumas linguagens, colorização, para que você obtenha uma compreensão clara de suas
referências. Para o C++, a nova interface do usuário inclui informações sobre se estamos lendo de uma
variável ou gravando em uma variável.
O recurso Dot-to-Arrow IntelliSense passou de experimental a avançado e agora está habilitado por
padrão. Os recursos do editor expandem escoposexpandem escopos e a precedência de expansãoprecedência de expansão também foram
movidos de experimental para avançado.
Os recursos de refatoração experimental alteram a assinaturaalteram a assinatura e a função Extractfunção Extract agora estão
disponíveis por padrão.
Adicionada uma funcionalidade experimental "Carregamento de projeto mais rápido" para projetos C++.
Na próxima vez que você abrir um projeto C++, ele será carregado mais rapidamente e, depois disso, ele
será carregado muito mais rapidamente!
Alguns desses recursos são comuns a outras linguagens e alguns são específicos do C++. Para saber mais
sobre essas novas funcionalidades, veja Anúncio do Visual Studio "15" Preview 5.
Foi adicionado o suporte a ClangFormat. Para obter mais informações, veja Suporte a ClangFormat no Visual
Studio 2017.
O Visual Studio 2017 apresenta o recurso abrir pastaabrir pasta . Ele permite que você codifique, crie e depure em uma
pasta que contém o código-fonte sem a necessidade de criar soluções ou projetos. Agora ficou muito mais fácil
começar a usar o Visual Studio, mesmo que seu projeto não seja um projeto do MSBuild. A pasta aber tapasta aber ta oferece
acesso a recursos avançados de compreensão, edição, criação e depuração de código. Eles são os mesmos que o
Visual Studio já fornece para projetos do MSBuild. Para saber mais, veja Projetos Open Folder para C++.
Melhorias na experiência de Abrir Pasta. Você pode personalizar a experiência por meio destes arquivos .json:
CppProperties.json para personalizar a experiência de navegação e do IntelliSense.
Tasks.json para personalizar as etapas de build.
Launch.json para personalizar a experiência de depuração.
Suporte aprimorado para ambientes de compilação e compiladores alternativos como MinGW e Cygwin. Para
saber mais, veja Usando MinGW e Cygwin com Visual C++ e Abrir Pasta.
Adicionado compatibilidade para definir variáveis de ambiente globais e específicas de configuração em
CppProperties.json e em CMakeSettings.json. Essas variáveis de ambiente podem ser consumidas por
configurações de depuração definidas em launch.vs.json e em tarefas em tasks.vs.json. Para saber mais, veja
Personalizando seu ambiente com o Visual C++ e Abrir Pasta.
Suporte aprimorado para o gerador Ninja do CMake, incluindo a capacidade de direcionar facilmente
plataformas de 64 bits.
O Visual Studio 2017 apresenta suporte ao uso de projetos CMake sem a conversão para arquivos de projeto
MSBuild (.vcxproj). Para saber mais, confira Projetos CMake no Visual Studio. Abrir projetos do CMake com a
pasta aber tapasta aber ta configura automaticamente o ambiente para edição, criação e depuração de C++.
O C++ IntelliSense funciona sem a necessidade de criar um arquivo CppProperties.json na pasta raiz.
https://devblogs.microsoft.com/visualstudio/announcing-visual-studio-15-preview-5/
https://devblogs.microsoft.com/cppblog/clangformat-support-in-visual-studio-2017-15-7-preview-1/
https://docs.microsoft.com/pt-br/cpp/build/open-folder-projects-cpp
https://devblogs.microsoft.com/cppblog/using-mingw-and-cygwin-with-visual-cpp-and-open-folder/
https://devblogs.microsoft.com/cppblog/customizing-your-environment-with-visual-c-and-open-folder/
https://docs.microsoft.com/pt-br/cpp/build/cmake-projects-in-visual-studio
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .4Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .4
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Desenvolvimento da área de trabalho do Windows
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Também adicionamos uma nova lista suspensa para permitir aos usuários mudar facilmente entre as
configurações fornecidas pelos arquivos CppProperties.json e CMake.
Há suporte para configurações adicionais por meio de um arquivo CMakeSettings.json que reside na
mesma pasta que o arquivo CMakeLists.txt.
Suporte adicionado para o gerador Ninja do CMake.
Suporte adicionado para importação de caches de CMake existentes.
Suporte adicionado para CMake 3.11, análise de código em projetos CMake, exibição de destinos no
Gerenciador de Soluções, opções de geração de cache e compilação de arquivo único. Para obter mais
informações, confira Suporte a CMake no Visual Studio e Projetos CMake no Visual Studio.
Agora, fornecemos uma experiência de instalação mais granular da carga de trabalho original do C++.
Adicionamos componentes selecionáveis que permitem a instalação apenas das ferramentas das quais você
precisa. Os tamanhos de instalação indicados para os componentes listados na interface do usuário do instalador
estão incorretos e subestimam o tamanho total.
Para criar projetos Win32 com êxito na carga de trabalho de área de trabalho C++, é necessário instalar um
conjunto de ferramentas e um SDK do Windows. Instalar os componentes recomendados (selecionados)
Conjunto de ferramentas do VC++ 2017 v141 (x86, x64)Conjunto de ferramentas do VC++ 2017 v141 (x86, x64) e SDK do Windows 10 (10.0.nnnnn)SDK do Windows 10 (10.0.nnnnn)
garantirá que isso funcionará. Se as ferramentas necessárias não estiverem instaladas, os projetos não serão
criados com êxito e o assistente deixará de responder.
As Ferramentas de Build do Visual C++ (anteriormente disponíveis como um produto autônomo) agora estão
incluídas como uma carga de trabalho no Instalador do Visual Studio. Essa carga de trabalho instala somente as
ferramentas necessárias para compilar projetos C++ sem instalar o IDE do Visual Studio. Ambos os conjuntos de
ferramentas v140 e v141 estão incluídos. O conjunto de ferramentas v141 contém as melhorias mais recentes do
Visual Studio 2017 versão 15.5. Para obtermais informações, consulte As Ferramentas de Build do Visual Studio
https://devblogs.microsoft.com/cppblog/cmake-support-in-visual-studio-targets-view-single-file-compilation-and-cache-generation-settings/
https://docs.microsoft.com/pt-br/cpp/build/cmake-projects-in-visual-studio
https://devblogs.microsoft.com/cppblog/visual-studio-build-tools-now-include-the-vs2017-and-vs2015-msvc-toolsets/
Desenvolvimento de Linux com C++
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .2Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .2
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Desenvolvimento de jogos com C++
Desenvolvimento móvel com C++ para Android e iOS
Aplicativos universais do Windows
Novas opções para C++ na UWP (Plataforma Universal do Windows)
agora incluem o VS2017 e Conjuntos de Ferramentas do VS2015 MSVC.
A extensão popular Visual C++ para Desenvolvimento no Linux agora faz parte do Visual Studio. Essa instalação
fornece tudo o que você precisa para desenvolver e depurar aplicativos em C++, em execução em um ambiente
Linux.
Foram feitas melhorias na visualização de tipo e no compartilhamento de código multiplataforma. Para saber
mais, veja Aprimoramentos do C++ para Linux para compartilhamento de código entre plataformas e
visualização de tipo.
A carga de trabalho do Linux adicionou suporte para rsyncrsync como uma alternativa ao SFTPSFTP para sincronizar
arquivos com computadores Linux remotos.
Foi adicionado suporte compilação cruzada direcionada a microcontroladores ARM. Para habilitar isso na
instalação, escolha a carga de trabalho Desenvolvimento para L inux com C++Desenvolvimento para L inux com C++ e selecione a opção para
Desenvolvimento Incorporado e de IoTDesenvolvimento Incorporado e de IoT. Essa opção adiciona as ferramentas de compilação cruzada do
ARM GCC e Make à sua instalação. Para obter mais informações, consulte Compilação cruzada do ARM GCC no
Visual Studio.
Foi adicionado o suporte a CMake. Agora, você pode trabalhar em sua base de código existente do CMake sem
precisar convertê-la em um projeto do Visual Studio. Para obter mais informações, consulte Configurar um
projeto do Linux CMake.
Foi adicionado suporte à execução de tarefas remotas. Essa funcionalidade permite executar qualquer
comando em um sistema remoto definido no Gerenciador de conexões do Visual Studio. As tarefas remotas
também fornecem a capacidade de copiar arquivos para o sistema remoto. Para obter mais informações,
consulte Configurar um projeto do Linux CMake.
Várias melhorias para cenários de carga de trabalho do Linux. Para obter mais informações, veja Melhorias na
carga de trabalho do Linux C++ para o Sistema de Projeto, para a Janela de Console do Linux, para rsync e
para Anexar ao Processo.
IntelliSense para cabeçalhos em conexões remotas do Linux. Para obter mais informações, veja IntelliSense
para cabeçalhos remotos do Linux e Configurar um projeto CMake do Linux.
Use todo o poder do C++ para compilar jogos profissionais com DirectX ou Cocos2d.
Agora, você pode criar e depurar aplicativos móveis usando o Visual Studio, que pode ser destinado ao Android e
iOS.
O C++ é fornecido como um componente opcional para a carga de trabalho do Aplicativo Universal do Windows.
No momento, você deve atualizar os projetos C++ manualmente. Você pode abrir um projeto de Plataforma
Universal do Windows direcionado ao v140 no Visual Studio 2017. No entanto, você precisa selecionar o conjunto
de ferramentas da plataforma v141 nas páginas de propriedades do projeto se não tiver o Visual Studio 2015
instalado.
https://marketplace.visualstudio.com/items?itemName=VisualCppDevLabs.VisualCforLinuxDevelopment
https://devblogs.microsoft.com/cppblog/linux-cross-platform-and-type-visualization/
https://devblogs.microsoft.com/cppblog/arm-gcc-cross-compilation-in-visual-studio/
https://docs.microsoft.com/pt-br/cpp/linux/cmake-linux-project
https://docs.microsoft.com/pt-br/cpp/linux/cmake-linux-project
https://devblogs.microsoft.com/cppblog/linux-c-workload-improvements-to-the-project-system-linux-console-window-rsync-and-attach-to-process/
https://devblogs.microsoft.com/cppblog/intellisense-for-remote-linux-headers/
https://docs.microsoft.com/pt-br/cpp/linux/cmake-linux-project
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
O conjunto de ferramentas da plataforma Clang/C2
Análise de código C++
Agora você tem novas opções para escrever e empacotar aplicativos C++ para o Plataforma Universal do
Windows e a Windows Store: a infraestrutura de ponte de desktop permite empacotar seu aplicativo de área de
trabalho existente ou objeto COM para implantação por meio da Windows Store. Ou, para implantação por meio
de seus canais existentes por meio de carregamento colateral. Novos recursos no Windows 10 permitem que você
adicione a funcionalidade UWP para seu aplicativo de área de trabalho de várias maneiras. Para saber mais, veja
Ponte de Desktop.
Foi adicionado um modelo de projeto do Projeto de Empacotamento de Aplicativo do WindowsProjeto de Empacotamento de Aplicativo do Windows , que
simplifica muito o empacotamento de aplicativos de área de trabalho usando a Ponte de Desktop. Ele está
disponível em Arquivo | Novo | Projeto | Instalado | Visual C++ | Plataforma Universal do WindowsArquivo | Novo | Projeto | Instalado | Visual C++ | Plataforma Universal do Windows .
Para saber mais, veja Empacotar um aplicativo usando o Visual Studio (Ponte de Desktop).
Ao escrever código novo, você pode usar a C++/WinRT, uma projeção de linguagem C++ padrão para o Windows
Runtime implementada exclusivamente em arquivos de cabeçalho. Ele permite consumir e criar Windows
Runtime APIs usando qualquer compilador C++ compatível com padrões. A C++/WinRT foi concebida para
oferecer aos desenvolvedores em C++ um acesso de primeira classe à moderna API do Windows. Para obter mais
informações, consulte C++/WinRT.
A partir do Build 17025 do SDK do Windows Insider Preview, o C++/WinRT está incluído na SDK do Windows.
Para obter mais informações, consulte C++/WinRT agora está incluído no SDK do Windows.
O conjunto de ferramentas Clang/C2 que acompanha o Visual Studio 2017 agora dá suporte ao /bigobj
comutador, que é crucial para a criação de projetos grandes. Ele também inclui várias correções de bugs
importantes, tanto no front-end do compilador quanto no back-end.
Os verificadores principais do C++ para impor as principais diretrizes do C++ agora são distribuídas com o Visual
Studio. Habilite os verificadores na página de extensões de análise de códigoextensões de análise de código nas páginas de propriedades do
projeto. As extensões são então incluídas quando você executa a análise de código. Para saber mais, veja Uso dos
verificadores de diretrizes de núcleo do C++.
https://docs.microsoft.com/pt-br/windows/uwp/porting/desktop-to-uwp-root
https://docs.microsoft.com/pt-br/windows/uwp/porting/desktop-to-uwp-packaging-dot-net
https://docs.microsoft.com/pt-br/windows/uwp/cpp-and-winrt-apis/
https://devblogs.microsoft.com/cppblog/cppwinrt-is-now-included-the-windows-sdk/
https://github.com/isocpp/CppCoreGuidelines
https://docs.microsoft.com/pt-br/cpp/code-quality/using-the-cpp-core-guidelines-checkers
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .3
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .6Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .6
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Testes de unidade no Visual Studio 2017
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .5
Vi su a l St u d i o 2 0 1 7 v e r são 1 5 .6Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .6
Adicionada compatibilidade com regras relacionadas ao gerenciamento de recursos.
As novas verificações de Diretrizes Principais do C++ abordam a exatidão do ponteiro inteligente, o uso
correto de inicializadores globais e a sinalização de usos de construções como goto e as conversões
incorretas.
Alguns números de aviso que podem ser encontrados na 15.3 não estão mais disponíveis no 15.5. Esses
avisos foram substituídos por verificações mais específicas.
Suporte adicionado para análise de arquivo único e melhorias no desempenho de tempo de execução de
análise. Para obter mais informações, veja Melhorias de análise estática do C++ para Visual Studio 2017 15.6
versão prévia 2
Suporte adicionado para /analyze:ruleset , que permite especificar as regras de análise de código a serem
executadas.
Suporte adicionado para regras de Diretrizes Principais do C++ adicionais. Para saber mais, veja Uso dos
verificadores de diretrizes de núcleo do C++.
O adaptador de Google Test e o Boost. o adaptador de teste agora estão disponíveis como componentes do
desenvolvimento de desktop comdesenvolvimento de desktop com carga de trabalho do C++. Eles são integrados ao Gerenciador de testesGerenciador de testes .
O suporte a CTest é adicionado para projetos CMake (usando a pasta aberta), embora a integração total com o
Gerenciador de testesGerenciador de testes ainda não esteja disponível. Para obter mais informações, consulte escrevendo testes de
unidade para C/C++.
https://devblogs.microsoft.com/cppblog/c-static-analysis-improvements-for-visual-studio-2017-15-6-preview-2/
https://docs.microsoft.com/pt-br/cpp/build/reference/analyze-code-analysis
https://docs.microsoft.com/pt-br/cpp/code-quality/using-the-cpp-core-guidelines-checkers
https://docs.microsoft.com/pt-br/visualstudio/test/writing-unit-tests-for-c-cpp
Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7Vi su a l St u d i o 2 0 1 7 v e r sã o 1 5 .7
Diagnóstico de gráficos do Visual Studio
Suporte adicionado para Boost.Test suporte de biblioteca dinâmica.
Um Boost.Test modelo de item agora está disponível no IDE.
Para obter mais informações, consulte Boost.Test teste de unidade: suporte a biblioteca dinâmica e novo modelo
de item.
Suporte de CodeLens adicionado para projetos de teste de unidade do C++. Para obter mais informações, veja
Apresentação do CodeLens para teste de unidade do C++.
Ferramentas de Diagnóstico de Gráficos do Visual Studio: você pode usá-las para registrar e analisar problemas
de desempenho e renderização em aplicativos Direct3D. Use-os em aplicativos que são executados localmente em
seu computador Windows, em um emulador de dispositivo do Windows ou em um computador ou dispositivo
remoto.
Entrada & saída para os sombreadores de vér tice e de geometr ia:Entrada & saída para os sombreadores de vér tice e de geometr ia: A capacidade de exibir entrada e
saída de sombreadores de vértice e sombreadores de geometria tem sido um dos recursos mais
solicitados. Agora há suporte nas ferramentas. Selecione o estágio VS ou GS na exibição estágios de
pipeline para começar a inspecionar sua entrada e saída na tabela a seguir.
Pesquisa e filtro na tabela de objetos:Pesquisa e filtro na tabela de objetos: fornece uma maneira rápida e fácil de localizar os recursos que
você está procurando.
Histór ico de Recursos:Histór ico de Recursos: esse novo modo de exibição fornece uma maneira simplificada de ver todo o
histórico de modificações de um recurso, enquanto ele foi usado durante a renderização de um quadro
capturado. Para invocar o histórico de qualquer recurso, clique no ícone de relógio ao lado de qualquer
https://devblogs.microsoft.com/cppblog/boost-test-unit-testing-dynamic-library-support-and-new-item-template/
https://docs.microsoft.com/pt-br/visualstudio/ide/find-code-changes-and-other-history-with-codelens
https://devblogs.microsoft.com/cppblog/announcing-codelens-for-c-unit-testing/
hiperlink de recurso.
Ele exibe a janela nova ferramenta de histór ico de recursoshistór ico de recursos , preenchida com o histórico de alterações do
recurso.
Você pode capturar quadros com a captura de pilha de chamadas completa habilitada. Isso permite deduzir
rapidamente o contexto de cada evento de alteração e inspecioná-lo em seu projeto do Visual Studio.
Defina a opção de captura de pilha completa na caixa de diálogo Opções de > de ferramentasOpções de > de ferramentas do Visual
Studio em diagnóstico de gráficosdiagnóstico de gráficos .
Estatísticas de API:Estatísticas de API: exibir um resumo de alto nível do uso da API em seu quadro. É útil para descobrir
chamadas que você pode não perceber que está fazendo tudo, ou chamadas que você está fazendo com
muita frequência. Essa janela está disponível por meio da exibição > estatísticas de APIexibição > estatísticas de API no analisador
de gráficos do Visual Studio.
Estatísticas de memória:Estatísticas de memória: Exiba a quantidade de memória que o driver aloca para os recursos que você
criar no quadro. Essa janela está disponível por meio da exibição > estatísticas de memóriaexibição > estatísticas de memória no
analisador de gráficos do Visual Studioanalisador de gráficos do Visual Studio. Para copiar dados para um arquivo CSV para exibição em
uma planilha, clique com o botão direito do mouse e escolha copiar tudocopiar tudo.
Validação de Quadro:Validação de Quadro: a nova lista de erros e avisos fornece uma maneira fácil de navegar em sua lista de
eventos com base em problemas potenciais detectados pela camada de depuração Direct3D. Clique em
exibir > validação de quadroexibir > validação de quadro em analisador de gráficos do Visual Studio para abrir a janela. Em seguida,
clique em Executar ValidaçãoExecutar Validação para iniciar a análise. Pode levar vários minutos para a análise ser
concluída, dependendo da complexidade do quadro.
Análise de quadros para D3D12:Análise de quadros para D3D12: Use a análise de quadros para analisar o desempenho de chamada de
empate com experimentos "What-If" direcionados. Mudar para a guia de Análise de Quadros e executar
uma análise para exibir o relatório. Para obter mais detalhes, assista ao vídeo GoingNative 25: Análise de
Quadros de Gráficos do Visual Studio.
Aprimoramentos de uso de GPU:Aprimoramentos de uso de GPU: Os rastreamentos abertos podem ser obtidos por meio do criador de
perfil de uso da GPU do Visual Studio com a exibição de GPU ou a ferramenta de Windows Performance
Analyzer (WPA) para uma análise mais detalhada. Se você tiver o kit de ferramentas de desempenho do
Windows instalado, haverá dois hiperlinks: um para WPA e outro para a exibição de GPU, na parte inferior
direita da visão geral da sessão.
Os rastreamentos abertos no modo de exibição de GPU por meio deste link dão suporte ao modo de
exibição sincronizado VS e GPU exibir zoom e panorâmica. Uma caixa de seleção no VS controla se a
sincronização está habilitada ou não.
https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-25-Offline-Analysis-Graphics-Tool
Para obter uma lista do que há de novo até o Visual Studio 2015, Atualização 3, confira Visual C++ What's New
2003 through 2015 (Novidades do Visual C++ 2003 a 2015).
Para obter mais informações sobre as novidades em todo o Visual Studio 2015, consulte as notas de versão. Eles
estão vinculados do histórico das notas de versão do Visual Studio 2015.
What ' s N ew for c++ in Visual studio 2019Para obter informações sobre as novidades do C++ no Visual Studio 2019, consulte .
N ovidades de C++ no Visual Studio 2017Para saber mais sobre novidades de C++ no Visual Studio 2017, confira .
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-what-s-new-2003-through-2015
https://docs.microsoft.com/pt-br/visualstudio/releasenotes/vs2015-version-history
Aprimoramentos de conformidade do C++ no
Visual Studio
12/11/2020 • 189 minutes to read • Edit Online
Melhorias de conformidade no VisualStudio 2019 RTW (versão 16,0)
Os módulos aprimorados dão suporte a modelos e à detecção de errosOs módulos aprimorados dão suporte a modelos e à detecção de erros
Especificação modificada de tipo de agregaçãoEspecificação modificada de tipo de agregação
struct A
{
A() = delete; // user-declared ctor
};
struct B
{
B() = default; // user-declared ctor
int i = 0;
};
A a{}; // ill-formed in C++20, previously well-formed
B b = { 1 }; // ill-formed in C++20, previously well-formed
Suporte parcial para Suporte parcial para operator <=>
O Microsoft C++ faz melhorias de conformidade e correções de bugs em cada versão. Este artigo lista as
melhorias por versão principal e depois pela versão. Ele também lista correções de bugs importantes por
versão. Para ir diretamente para as alterações de uma versão específica, use a lista Neste ar tigoNeste ar tigo.
O Visual Studio 2019 RTW contém as seguintes melhorias de conformidade, correções de bugs e alterações de
comportamento no compilador do Microsoft C++ (MSVC)
Obser vação:Obser vação: Os recursos do c++ 20 serão disponibilizados no /std:c++latest modo até que a
implementação do c++ 20 seja concluída para o compilador e o IntelliSense. Nesse momento, o /std:c++20
modo do compilador será introduzido.
Agora os módulos estão oficialmente no padrão C++20. O suporte aprimorado foi adicionado no Visual Studio
2017 versão 15.9. Para saber mais, confira Melhor detecção de erro e de suporte de modelo em Módulos do
C++ com o MSVC 2017 versão 15.9.
A especificação de um tipo de agregação foi alterada no C++20 (confira Proibir agregações com construtores
declarados pelo usuário). No Visual Studio 2019, em /std:c++latest , uma classe com qualquer Construtor
declarado pelo usuário (por exemplo, incluindo um construtor declarado = default ou = delete ) não é uma
agregação. Anteriormente, somente os construtores fornecidos pelo usuário desqualificariam uma classe de
uma agregação. Essa alteração impõe outras restrições sobre como esses tipos podem ser inicializados.
O código a seguir compila sem erros no Visual Studio 2017, mas gera erros C2280 e C2440 no Visual Studio
2019 em /std:c++latest :
P0515R3 O C++20 apresenta o operador de comparação de três vias <=> , também conhecido como o
"operador espaçonave". O Visual Studio 2019 no /std:c++latest modo apresenta suporte parcial para o
operador, gerando erros de sintaxe que agora não é permitido. Por exemplo, o código a seguir compila sem
erros no Visual Studio 2017, mas gera vários erros no Visual Studio 2019 em /std:c++latest :
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/cpp-conformance-improvements.md
https://devblogs.microsoft.com/cppblog/better-template-support-and-error-detection-in-c-modules-with-msvc-2017-version-15-9/
https://wg21.link/p1008r1
https://wg21.link/p0515r3
struct S
{
bool operator<=(const S&) const { return true; }
};
template <bool (S::*)(const S&) const>
struct U { };
int main(int argc, char** argv)
{
U<&S::operator<=> u; // In Visual Studio 2019 raises C2039, 2065, 2146.
}
Referências a tipos sem qualificadores CV incompatíveisReferências a tipos sem qualificadores CV incompatíveis
struct X
{
const void* const& PData() const
{
return _pv;
}
void* _pv;
};
int main()
{
X x;
auto p = x.PData(); // C4172
}
reinterpret_cast de uma função sobrecarregada de uma função sobrecarregada
int f(int) { return 1; }
int f(float) { return .1f; }
using fp = int(*)(int);
int main()
{
fp r = reinterpret_cast<fp>(&f);
}
Para evitar os erros, insira um espaço na linha incorreta antes do colchete angular final: U<&S::operator<= > u; .
Anteriormente, o MSVC permitia associação direta de uma referência a partir de um tipo com qualificadores CV
incompatíveis abaixo do nível superior. Essa associação poderia permitir a modificação de dados const
supostamente mencionados pela referência. Agora, o compilador cria um temporário, conforme exigido pelo
padrão. No Visual Studio 2017, o código a seguir é compilado sem avisos. No Visual Studio 2019, o compilador
gera o aviso C4172: <func:#1 "?PData@X@@QBEABQBXXZ"> returning address of local variable or temporary. :
O argumento para reinterpret_cast não é um dos contextos nos quais o endereço de uma função
sobrecarregada é permitido. O código a seguir compila sem erros no Visual Studio 2017, mas no Visual Studio
2019 ele gera o erro C2440: cannot convert from 'overloaded-function' to 'fp' :
Para evitar o erro, use uma conversão permitida para esse cenário:
int f(int);
int f(float);
using fp = int(*)(int);
int main()
{
fp r = static_cast<fp>(&f); // or just &f;
}
Fechamentos lambdaFechamentos lambda
int main()
{
constexpr auto l = [] {}; // C2127 in VS2019
}
Códigos de falha de Códigos de falha de std::create_directory
operator<<(std::ostream, nullptr_t)
Algoritmos paralelos adicionaisAlgoritmos paralelos adicionais
inicialização atômicainicialização atômica
remove_cvref e e remove_cvref_t
Macros de teste de recursoMacros de teste de recurso
Proibir agregações com construtores declarados pelo usuárioProibir agregações com construtores declarados pelo usuário
No C++ 14, os tipos de fechamento lambda não são literais. A principal consequência dessa regra é que um
lambda não pode ser atribuído a uma constexpr variável. O código a seguir compila sem erros no Visual
Studio 2017, mas no Visual Studio 2019 ele gera o erro C2127:
'l': illegal initialization of 'constexpr' entity with a non-constant expression :
Para evitar o erro, remova o constexpr qualificador ou, caso contrário, altere o modo de conformidade para
/std:c++17 .
P1164 implementado de C++20 incondicionalmente. Isso altera std::create_directory para verificar se o
destino já foi um diretório em caso de falha. Anteriormente, todos os erros do tipo ERROR_ALREADY_EXISTS
foram convertidos em códigos de êxito, mas não criados pelo diretório.
Por LWG 2221, operator<<(std::ostream, nullptr_t) adicionado para gravação de nullptrs em fluxos.
Novas versões paralelas de is_sorted , is_sorted_until , is_partitioned , set_difference , set_intersection ,
is_heap e is_heap_until .
P0883 "Corrigindo inicialização atômica" altera std::atomic para o valor-inicializar o T independente, em vez
do padrão-inicializando-o. A correção é habilitada ao usar o Clang/LLVM com a biblioteca padrão da Microsoft.
Atualmente, ele está desabilitado para o compilador do Microsoft C++, como uma solução alternativa para um
bug no constexpr processamento.
Implementação das características de tipo remove_cvref e remove_cvref_t de P0550. Elas removem a
capacidade de referência e a qualificação CV de um tipo sem funções e matrizes decrescentes para ponteiros
(diferentemente de std::decay e std::decay_t ).
P0941R2 – macros de teste de recurso está concluído, com suporte para __has_cpp_attribute . Macros de teste
de recurso têm suporte em todos os modos padrão.
C++20 P1008R1 – proibição de agregações com construtores declarados pelo usuário está concluído.
https://wg21.link/p1164r1
https://cplusplus.github.io/LWG/issue2221
https://wg21.link/p0883r1
https://wg21.link/p0550r2
https://wg21.link/p0941r2
https://wg21.link/p1008r1
Melhorias de conformidade no 16,1
char8_tchar8_t
ExemploExemplo
const char* s = u8"Hello"; // C++17
const char8_t* s = u8"Hello"; // C++20
Metafunção std::type_identity e objeto de função std::identityMetafunção std::type_identity e objeto de função std::identity
#include <type_traits>
using T = std::identity<int>::type;
T x, y = std::identity<T>{}(x);
int i = 42;
long j = std::identity<long>{}(i);
#include <type_traits>
#include <functional>
using T = std::type_identity<int>::type;
T x, y = std::identity{}(x);
int i = 42;
long j = static_cast<long>(i);
Verificações de sintaxe para lambdas genéricosVerificações de sintaxe para lambdas genéricos
P0482r6. O C++20 adiciona um novo tipo de caractere usado para representar unidades de código UTF-8.Os
literais de cadeia de caracteres u8 no C++20 têm o tipo const char8_t[N] , em vez de const char[N] , que era
o caso anteriormente. Alterações semelhantes foram propostas para o padrão C no N2231. As sugestões para a
char8_t correção de compatibilidade com versões anteriores são fornecidas em P1423r3. O compilador do
Microsoft C++ adiciona suporte para char8_t o no Visual Studio 2019 versão 16,1 quando você especifica a
/Zc:char8_t opção do compilador. No futuro, ele terá suporte com /std:c++latest , que pode ser revertido
para o comportamento do c++ 17 por meio do /Zc:char8_t- . O compilador EDG que capacita o IntelliSense
ainda não oferece suporte a ele. Você pode ver erros falsos somente do IntelliSense que não afetam a
compilação real.
Type_identity P0887R1. A extensão do modelo de classe std::identity preterido foi removida e substituída
pela metafunção std::type_identity do C++20 e pelo objeto de função std::identity . Ambos estão
disponíveis apenas em /std:c++latest .
O exemplo a seguir produz C4996 de aviso de reprovação para std::identity (definido em <type_traits> ) no
Visual Studio 2017:
O exemplo a seguir mostra como usar o novo std::identity (definido em <functional> ) junto com o novo
std::type_identity :
O novo processador lambda permite algumas verificações sintáticas de modo de conformidade em lambdas
genéricos, em /std:c++latest ou sob qualquer outro modo de linguagem com
/experimental:newLambdaProcessor .
No Visual Studio 2017, esse código é compilado sem avisos, mas no Visual Studio 2019 ele produz o erro
C2760 syntax error: unexpected token '\<id-expr>', expected 'id-expression' :
https://wg21.link/p0482r6
https://wg14.link/n2231
https://wg21.link/p1423r3
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://wg21.link/p0887r1
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
void f() {
auto a = [](auto arg) {
decltype(arg)::Type t;
};
}
void f() {
auto a = [](auto arg) {
typename decltype(arg)::Type t;
};
}
Pesquisa dependente de argumento para chamadas de funçãoPesquisa dependente de argumento para chamadas de função
Inicialização designadaInicialização designada
Funções da biblioteca padrão novas e atualizadas (C++20)Funções da biblioteca padrão novas e atualizadas (C++20)
Melhorias de conformidade no 16,2
noexcept``constexpr funções dofunções do
constexpr int f() { return 0; }
int main() {
static_assert(noexcept(f()), "f should be noexcept"); // C2338 in 16.2
}
constexpr int f() noexcept { return 0; }
int main() {
static_assert(noexcept(f()), "f should be noexcept");
}
Expressões binárias com diferentes tipos de enumeraçãoExpressões binárias com diferentes tipos de enumeração
O exemplo a seguir mostra a sintaxe correta, agora imposta pelo compilador :
P0846R0 (c++ 20) aumentou a capacidade de localizar modelos de função por meio de pesquisa dependente
de argumento para expressões de chamada de função com argumentos de modelo explícitos. Requer
/std:c++latest .
A inicialização designada do P0329R4 (c++ 20) permite que membros específicos sejam selecionados na
inicialização agregada usando a Type t { .member = expr } sintaxe. Requer /std:c++latest .
starts_with() e ends_with() para basic_string e basic_string_view .
contains() para contêineres associativos.
remove() , remove_if() , e unique() para list e forward_list agora retornam size_type .
shift_left() e shift_right() adicionados a <algorithm>.
constexpr as funções não são mais consideradas noexcept por padrão quando usadas em uma expressão
constante. Essa alteração de comportamento vem da resolução do CWG 1351 e está habilitada no
/permissive- . O exemplo a seguir compila no Visual Studio 2019 versão 16,1 e anterior, mas produz C2338 no
Visual Studio 2019 versão 16,2:
Para corrigir o erro, adicione a noexcept expressão à declaração da função:
O c++ 20 preteriu as conversões aritméticas usuais em operandos, em que:
https://wg21.link/p0846r0
https://wg21.link/p0329r4
https://wg21.link/cwg1351
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
enum E1 { a };
enum E2 { b };
int main() {
int i = a | b; // warning C5054: operator '|': deprecated between enumerations of different types
}
enum E1 { a };
enum E2 { b };
int main() {
int i = a | static_cast<int>(b);
}
enum E1 { a };
int main() {
double i = a * 1.1;
}
enum E1 { a };
int main() {
double i = static_cast<int>(a) * 1.1;
}
Igualdade e comparações relacionais de matrizesIgualdade e comparações relacionais de matrizes
int main() {
int a[] = { 1, 2, 3 };
int b[] = { 1, 2, 3 };
if (a == b) { return 1; }
}
Um operando é do tipo de enumeração e
o outro é de um tipo de enumeração diferente ou de um tipo de ponto flutuante.
Para obter mais informações, consulte P1120R0.
No Visual Studio 2019 versão 16,2 e posteriores, o código a seguir produz um aviso de nível 4 quando a
/std:c++latest opção do compilador está habilitada:
Para evitar o aviso, use static_cast para converter o segundo operando:
Usar uma operação binária entre uma enumeração e um tipo de ponto flutuante agora é um aviso quando a
/std:c++latest opção do compilador está habilitada:
Para evitar o aviso, use static_cast para converter o segundo operando:
As comparações de igualdade e relacional entre dois operandos do tipo de matriz são preteridas em C++ 20
(P1120R0). Em outras palavras, uma operação de comparação entre duas matrizes (apesar das semelhanças de
classificação e extensão) é agora um aviso. A partir do Visual Studio 2019 versão 16,2, o código a seguir produz
C5056: operator '==': deprecated for array types quando a /std:c++latest opção do compilador está
habilitada:
Para evitar o aviso, você pode comparar os endereços dos primeiros elementos:
https://wg21.link/p1120r0
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/cpp/static-cast-operator
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/cpp/static-cast-operator
https://wg21.link/p1120r0
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
int main() {
int a[] = { 1, 2, 3 };
int b[] = { 1, 2, 3 };
if (&a[0] == &b[0]) { return 1; }
}
std::equal(std::begin(a), std::end(a), std::begin(b), std::end(b));
Efeito de definir o operador de espaçamento em Efeito de definir o operador de espaçamento em == e e !=
#include <compare>
struct S {
int a;
auto operator<=>(const S& rhs) const {
return a <=> rhs.a;
}
};
bool eq(const S& lhs, const S& rhs) {
return lhs == rhs;
}
bool neq(const S& lhs, const S& rhs) {
return lhs != rhs;
}
#include <compare>
struct S {
int a;
auto operator<=>(const S& rhs) const {
return a <=> rhs.a;
}
bool operator==(const S&) const = default;
};
bool eq(const S& lhs, const S& rhs) {
return lhs == rhs;
}
bool neq(const S& lhs, const S& rhs) {
return lhs != rhs;
}
Aprimoramentos da biblioteca padrãoAprimoramentos da biblioteca padrão
Para determinar se o conteúdo de duas matrizes é igual, use a função std:: equal :
Uma definição do operador Spaceship ( <=> ) sozinha não irá mais reescrever expressões que envolvam ==
ou a != menos que o operador de espaço esteja marcado como = default ( P1185R2). O exemplo a seguir é
compilado no Visual Studio 2019 RTW e na versão 16,1, mas produz C2678 no Visual Studio 2019 versão 16,2:
Para evitar o erro, defina o operador = = ou declare-o como padrão:
<charconv> to_chars() com precisão fixa/científica. (A precisão geral está atualmente planejada para 16,4.)
P0020R6: Atomic <float> , atômico <double> , atômico<long double>
P0463R1: endian
P0482R6: suporte de bibliotecapara char8_t
P0600R1: [ [ nodescarte]] para a STL, parte 1
P0653R2: to_address ()
P0754R2: <version>
https://docs.microsoft.com/pt-br/cpp/standard-library/algorithm-functions
https://wg21.link/p1185r2
https://wg21.link/p0020r6
https://wg21.link/p0463r1
https://wg21.link/p0482r6
https://wg21.link/p0600r1
https://wg21.link/p0653r2
https://wg21.link/p0754r2
Melhorias de conformidade no Visual Studio 2019 versão 16,3
Operadores de extração de fluxo para char * removidosOperadores de extração de fluxo para char * removidos
char x[42];
char* p = x;
std::cin >> std::setw(42);
std::cin >> p;
char x[42];
std::cin >> x;
Novas palavras-chave Novas palavras-chave requires e e concept
Construtores como nomes de tipo não permitidosConstrutores como nomes de tipo não permitidos
#include <chrono>
class Foo {
std::chrono::milliseconds::duration TotalDuration{};
};
#include <chrono>
class Foo {
std::chrono::milliseconds TotalDuration {};
};
Verificação mais estrita de Verificação mais estrita de extern "C" funções funções
P0771R1: Noexcept para o construtor de movimentação std:: function
Os operadores de extração de fluxo para ponteiro para caracteres foram removidos e substituídos pelos
operadores de extração para a matriz de caracteres (por P0487R1). WG21 considera que as sobrecargas
removidas não são seguras. No /std:c++latest modo, o exemplo a seguir agora produz C2679:
binary '>>': no operator found which takes a right-hand operand of type 'char*' (or there is no acceptable
conversion)
:
Para evitar o erro, use o operador de extração com uma variável char []:
Novas palavras-chave requires e foram concept adicionadas ao compilador do Microsoft C++. Se você tentar
usar uma como um identificador no /std:c++latest modo, o compilador irá gerar C2059: syntax error .
O compilador não considera mais os nomes de construtor como nomes de classe injetados nesse caso: quando
eles aparecem em um nome qualificado após um alias para uma especialização de modelo de classe.
Anteriormente, os construtores eram utilizáveis como um nome de tipo para declarar outras entidades. O
exemplo a seguir agora produz C3646: 'TotalDuration': unknown override specifier :
Para evitar o erro, declare TotalDuration conforme mostrado aqui:
Se uma extern "C" função foi declarada em namespaces diferentes, as versões anteriores do compilador do
Microsoft C++ não verificaram se as declarações eram compatíveis. A partir do Visual Studio 2019 versão 16,3,
o compilador verifica a compatibilidade. No /permissive- modo, o código a seguir produz erros C2371
redefinition; different basic types e C2733 you cannot overload a function with C linkage :
https://wg21.link/p0771r1
https://wg21.link/p0487r1
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
using BOOL = int;
namespace N
{
extern "C" void f(int, int, int, bool);
}
void g()
{
N::f(0, 1, 2, false);
}
extern "C" void f(int, int, int, BOOL){}
Aprimoramentos da biblioteca padrãoAprimoramentos da biblioteca padrão
Melhorias de conformidade no Visual Studio 2019 versão 16,4
Melhor imposição de pesquisa de nome de duas fases para as IDs qualificadas em Melhor imposição de pesquisa de nome de duas fases para as IDs qualificadas em /permissive-
template <class T>
int f() {
return N::f() + T{}; // error C2039: 'f': is not a member of 'N'
}
namespace N {
int f() { return 42; }
}
namespace N {
int f();
}
template <class T>
int f() {
return N::f() + T{};
}
namespace N {
int f() { return 42; }
}
Conversão implícita de expressões de constante integral para ponteiro nuloConversão implícita de expressões de constante integral para ponteiro nulo
Para evitar os erros no exemplo anterior, use bool em vez de BOOL consistentemente em ambas as
declarações do f .
Os cabeçalhos não padrão <stdexcpt.h> e foram <typeinfo.h> removidos. O código que os inclui deve incluir
os cabeçalhos padrão <exception> e <typeinfo> , respectivamente.
A pesquisa de nome em duas fases requer que os nomes não dependentes usados nos corpos do modelo
fiquem visíveis para o modelo no tempo de definição. Anteriormente, esses nomes podem ter sido encontrados
quando o modelo é instanciado. Essa alteração torna mais fácil escrever código portátil e de conformidade no
MSVC sob o /permissive- sinalizador.
No Visual Studio 2019 versão 16,4 com o /permissive- sinalizador definido, o exemplo a seguir produz um
erro, porque N::f não está visível quando o f<T> modelo é definido:
Normalmente, esse erro pode ser corrigido incluindo cabeçalhos ausentes ou funções ou variáveis
declaradoras de encaminhamento, conforme mostrado no exemplo a seguir :
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
int* f(bool* p) {
p = false; // error C2440: '=': cannot convert from 'bool' to 'bool *'
p = 0; // OK
return false; // error C2440: 'return': cannot convert from 'bool' to 'int *'
}
int* f(bool* p) {
p = nullptr; // OK
p = 0; // OK
return nullptr; // OK
}
Regras padrão para tipos de literais inteirosRegras padrão para tipos de literais inteiros
void f(int r) {
int i = 2964557531; // warning C4309: truncation of constant value
long long j = 0x8000000000000000ll >> r; // literal is now unsigned, shift will fill high-order bits
with 0
}
void f(int r) {
int i = 2964557531u; // OK
long long j = (long long)0x8000000000000000ll >> r; // shift will keep high-order bits
}
Parâmetros de função que os parâmetros de modelo de sombraParâmetros de função que os parâmetros de modelo de sombra
O compilador MSVC agora implementa o CWG Issue 903 no modo de conformidade ( /permissive- ). Essa
regra não permite a conversão implícita de expressões de constante integral (exceto para o literal inteiro ' 0 ')
para constantes de ponteiro NULL. O exemplo a seguir produz C2440 no modo de conformidade:
Para corrigir o erro, use nullptr em vez de false . Um literal 0 ainda é permitido:
No modo de conformidade (habilitado por /permissive- ), o MSVC usa as regras padrão para tipos de literais
inteiros. Literais decimais muito grandes para se ajustarem a um signed int tipo anteriormente determinado
unsigned int . Agora, esses literais recebem o próximo maior signed tipo de inteiro, long long . Além disso,
literais com o sufixo ' ' que são muito grandes para caber em um tipo recebem o signed tipo
unsigned long long .
Essa alteração pode levar a geração de diagnósticos de aviso diferentes e diferenças de comportamento para
operações aritméticas em literais.
O exemplo a seguir mostra o novo comportamento no Visual Studio 2019 versão 16,4. A i variável agora é
do tipo unsigned int . É por isso que o aviso é gerado. Os bits de ordem superior da variável j são definidos
como 0.
O exemplo a seguir demonstra como manter o comportamento antigo e evitar os avisos e a alteração de
comportamento de tempo de execução:
O compilador MSVC agora gera um erro quando um parâmetro de função sombreia um parâmetro de modelo:
https://wg21.link/cwg903
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
template<typename T>
void f(T* buffer, int size, int& size_read);
template<typename T, int Size>
void f(T(&buffer)[Size], int& Size) // error C7576: declaration of 'Size' shadows a template parameter
{
return f(buffer, Size, Size);
}
template<typename T>
void f(T* buffer, int size, int& size_read);
template<typename T, int Size>
void f(T (&buffer)[Size], int& size_read)
{
return f(buffer, Size, size_read);
}
Especializações fornecidas pelo usuário de características de tipoEspecializações fornecidas pelo usuário de características de tipo
#include <type_traits>
struct S;
template<>
struct std::is_fundamental<S> : std::true_type {};static_assert(std::is_fundamental<S>::value, "fail");
#include <type_traits>
struct S;
template<typename T>
struct my_is_fundamental : std::is_fundamental<T> {};
template<>
struct my_is_fundamental<S> : std::true_type { };
static_assert(my_is_fundamental<S>::value, "fail");
Alterações nos operadores de comparação fornecidos pelo compiladorAlterações nos operadores de comparação fornecidos pelo compilador
Para corrigir o erro, altere o nome de um dos parâmetros:
Em conformidade com a subcláusula meta. rqmts do padrão, o compilador MSVC agora gera um erro quando
encontra uma especialização definida pelo usuário de um dos type_traits modelos especificados no std
namespace. A menos que especificado de outra forma, essas especializações resultam em um comportamento
indefinido. O exemplo a seguir tem um comportamento indefinido porque ele viola a regra e a static_assert
falha com o erro C2338.
Para evitar o erro, defina um struct que herde do preferencial type_trait e specialize que:
O compilador MSVC agora implementa as seguintes alterações para operadores de comparação por P1630R1
quando a /std:c++latest opção está habilitada:
O compilador não reescreve as expressões usando operator== se envolve um tipo de retorno que não é um
bool . O código a seguir agora produz o erro C2088: '!=': illegal for struct :
https://wg21.link/p1630r1
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
struct U {
operator bool() const;
};
struct S {
U operator==(const S&) const;
};
bool neq(const S& lhs, const S& rhs) {
return lhs != rhs;
}
struct U {
operator bool() const;
};
struct S {
U operator==(const S&) const;
U operator!=(const S&) const;
};
bool neq(const S& lhs, const S& rhs) {
return lhs != rhs;
}
#include <compare>
union S {
int a;
char b;
auto operator<=>(const S&) const = default;
};
bool lt(const S& lhs, const S& rhs) {
return lhs < rhs;
}
#include <compare>
union S {
int a;
char b;
auto operator<=>(const S&) const { ... }
};
bool lt(const S& lhs, const S& rhs) {
return lhs < rhs;
}
Para evitar o erro, você deve definir explicitamente o operador necessário:
O compilador não definirá mais um operador de comparação padronizado se for um membro de uma classe
semelhante a Union. O exemplo a seguir agora produz o erro C2120: 'void' illegal with all types :
Para evitar o erro, defina um corpo para o operador:
O compilador não definirá mais um operador de comparação padronizado se a classe contiver um membro de
referência. O código a seguir agora produz o erro C2120: 'void' illegal with all types :
#include <compare>
struct U {
int& a;
auto operator<=>(const U&) const = default;
};
bool lt(const U& lhs, const U& rhs) {
return lhs < rhs;
}
#include <compare>
struct U {
int& a;
auto operator<=>(const U&) const { ... };
};
bool lt(const U& lhs, const U& rhs) {
return lhs < rhs;
}
Melhorias de conformidade no Visual Studio 2019 versão 16,5
Declaração de especialização explícita sem um inicializador não é uma definiçãoDeclaração de especialização explícita sem um inicializador não é uma definição
template <typename> struct S {
static int a;
};
// In permissive-, this declaration isn't a definition, and the program won't link.
template <> int S<char>::a;
int main() {
return S<char>::a;
}
error LNK2019: unresolved external symbol "public: static int S<char>::a" (?a@?$S@D@@2HA) referenced in
function _main
at link time.
Para evitar o erro, defina um corpo para o operador:
Em /permissive- , MSVC agora impõe uma regra padrão que declarações de especialização explícitas sem
inicializadores não são definições. Anteriormente, a declaração seria considerada uma definição com um
inicializador padrão. O efeito é observável no momento do link, pois um programa que depende desse
comportamento agora pode ter símbolos não resolvidos. Este exemplo agora resulta em um erro:
Para resolver o problema, adicione um inicializador:
template <typename> struct S {
static int a;
};
// Add an initializer for the declaration to be a definition.
template <> int S<char>::a{};
int main() {
return S<char>::a;
}
A saída do pré-processador preserva as novas linhasA saída do pré-processador preserva as novas linhas
#define m()
line m(
) line
line line
#line 2
line
line
as palavras-chave ' import ' e ' module ' são dependentes de contextoas palavras-chave ' import ' e ' module ' são dependentes de contexto
import // Invalid
m;
error C2146: syntax error: missing ';' before identifier 'm'
import m; // OK
Remoção de std:: weak_equality e std:: strong_equalityRemoção de std:: weak_equality e std:: strong_equality
O pré-processador experimental agora preserva as novas linhas e o espaço em branco ao usar /P ou /E com
/experimental:preprocessor .
Dada esta origem de exemplo,
A saída anterior do /E foi:
A nova saída de /E é agora:
Por P1857R1, as diretivas de pré-processador de importação e de módulo têm restrições adicionais sobre sua
sintaxe. Este exemplo não compila mais:
Ele produz a seguinte mensagem de erro:
Para resolver o problema, mantenha a importação na mesma linha:
A mesclagem de P1959R0 exige que o compilador remova o comportamento e as referências aos
std::weak_equality std::strong_equality tipos e.
O código neste exemplo não compila mais:
#include <compare>
struct S {
std::strong_equality operator<=>(const S&) const = default;
};
void f() {
nullptr<=>nullptr;
&f <=> &f;
&S::operator<=> <=> &S::operator<=>;
}
error C2039: 'strong_equality': is not a member of 'std'
error C2143: syntax error: missing ';' before '<=>'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C7546: binary operator '<=>': unsupported operand types 'nullptr' and 'nullptr'
error C7546: binary operator '<=>': unsupported operand types 'void (__cdecl *)(void)' and 'void (__cdecl
*)(void)'
error C7546: binary operator '<=>': unsupported operand types 'int (__thiscall S::* )(const S &) const' and
'int (__thiscall S::* )(const S &) const'
#include <compare>
struct S {
std::strong_ordering operator<=>(const S&) const = default; // prefer 'std::strong_ordering'
};
void f() {
nullptr != nullptr; // use pre-existing builtin operator != or ==.
&f != &f;
&S::operator<=> != &S::operator<=>;
}
Alterações na proteção TLSAlterações na proteção TLS
Melhor diagnóstico de chamada para funções excluídasMelhor diagnóstico de chamada para funções excluídas
O exemplo agora leva a esses erros:
Para resolver o problema, atualize para preferir os operadores relacionais internos e substitua os tipos
removidos:
Anteriormente, as variáveis de local de thread em DLLs não foram inicializadas corretamente. Além do thread
que carregou a DLL, eles não foram inicializados antes do primeiro uso em threads que existiam antes do
carregamento da DLL. Este defeito foi corrigido agora. Variáveis de local de thread em tal DLL são inicializadas
imediatamente antes de seu primeiro uso em tais threads.
Esse novo comportamento de teste para inicialização em usos de variáveis de local de thread pode ser
desabilitado usando a /Zc:tlsGuards- opção de compilador. Ou, adicionando o [[msvc:no_tls_guard]] atributo
a determinadas variáveis locais de thread.
Nosso compilador era mais permissivo sobre chamadas para funções excluídas anteriormente. Por exemplo, se
as chamadas ocorreram no contexto de um corpo de modelo, não diagnosticaremos a chamada. Além disso, se
houver várias instâncias de chamadas para funções excluídas, poderíamos emitir apenas um diagnóstico.
Agora, emitimos um diagnóstico para cada um deles.
Uma consequência do novo comportamento pode produzir uma pequena alteração significativa: o código que
chamou uma função excluída não seria diagnosticado se nunca fosse necessário paraa geração de código.
Agora, vamos diagnostica-lo antecipadamente.
struct S {
S() = delete;
S(int) { }
};
struct U {
U() = delete;
U(int i): s{ i } { }
S s{};
};
U u{ 0 };
error C2280: 'S::S(void)': attempting to reference a deleted function
note: see declaration of 'S::S'
note: 'S::S(void)': function was explicitly deleted
struct S {
S() = delete;
S(int) { }
};
struct U {
U() = delete;
U(int i): s{ i } { }
S s; // Do not call the deleted ctor of 'S'.
};
U u{ 0 };
Melhorias de conformidade no Visual Studio 2019 versão 16,6
Os fluxos de biblioteca padrão rejeitam inserções de tipos de caracteres codificados incorretamenteOs fluxos de biblioteca padrão rejeitam inserções de tipos de caracteres codificados incorretamente
Este exemplo mostra o código que agora produz um erro:
Para resolver o problema, remova as chamadas para funções excluídas:
Tradicionalmente, inserir um wchar_t em um std::ostream , e inserir char16_t ou char32_t em um
std::ostream ou std::wostream , gera seu valor integral. A inserção de ponteiros para esses tipos de caractere
gera o valor do ponteiro. Os programadores não encontram nenhum dos casos intuitivos. Em geral, eles
esperam que a biblioteca padrão transcodifique o caractere ou a cadeia de caracteres terminada em nulo e gere
o resultado.
A proposta de C++ 20 P1423R3 adiciona sobrecargas de operador de inserção de fluxo excluídas para essas
combinações de tipos de ponteiro de fluxo e caractere ou caractere. Em /std:c++latest , as sobrecargas
tornam essas inserções malformadas, em vez de se comportarem do que é provavelmente uma maneira não
intencional. O compilador gera o erro C2280 quando um é encontrado. Você pode definir a macro "hachura de
escape" _HAS_STREAM_INSERTION_OPERATORS_DELETED_IN_CXX20 para 1 restaurar o comportamento antigo. (A
proposta também exclui operadores de inserção de fluxo para char8_t . Nossa biblioteca padrão implementou
sobrecargas semelhantes quando adicionamos char8_t suporte, de modo que o comportamento "errado"
nunca esteve disponível para o char8_t .)
Este exemplo mostra o comportamento com essa alteração:
https://wg21.link/p1423r3
#include <iostream>
int main() {
const wchar_t cw = L'x', *pw = L"meow";
const char16_t c16 = u'x', *p16 = u"meow";
const char32_t c32 = U'x', *p32 = U"meow";
std::cout << cw << ' ' << pw << '\n';
std::cout << c16 << ' ' << p16 << '\n';
std::cout << c32 << ' ' << p32 << '\n';
std::wcout << c16 << ' ' << p16 << '\n';
std::wcout << c32 << ' ' << p32 << '\n';
}
error C2280: 'std::basic_ostream<char,std::char_traits<char>> &std::<<<std::char_traits<char>>
(std::basic_ostream<char,std::char_traits<char>> &,wchar_t)': attempting to reference a deleted function
error C2280: 'std::basic_ostream<char,std::char_traits<char>> &std::<<<std::char_traits<char>>
(std::basic_ostream<char,std::char_traits<char>> &,char16_t)': attempting to reference a deleted function
error C2280: 'std::basic_ostream<char,std::char_traits<char>> &std::<<<std::char_traits<char>>
(std::basic_ostream<char,std::char_traits<char>> &,char32_t)': attempting to reference a deleted function
error C2280: 'std::basic_ostream<wchar_t,std::char_traits<wchar_t>> &std::<<<std::char_traits<wchar_t>>
(std::basic_ostream<wchar_t,std::char_traits<wchar_t>> &,char16_t)': attempting to reference a deleted
function
error C2280: 'std::basic_ostream<wchar_t,std::char_traits<wchar_t>> &std::<<<std::char_traits<wchar_t>>
(std::basic_ostream<wchar_t,std::char_traits<wchar_t>> &,char32_t)': attempting to reference a deleted
function
#include <iostream>
int main() {
const wchar_t cw = L'x', *pw = L"meow";
const char16_t c16 = u'x', *p16 = u"meow";
const char32_t c32 = U'x', *p32 = U"meow";
std::cout << (unsigned)cw << ' ' << (const void*)pw << '\n'; // Outputs "120 0052B1C0"
std::cout << (unsigned)c16 << ' ' << (const void*)p16 << '\n'; // Outputs "120 0052B1CC"
std::cout << (unsigned)c32 << ' ' << (const void*)p32 << '\n'; // Outputs "120 0052B1D8"
std::wcout << (unsigned)c16 << ' ' << (const void*)p16 << '\n'; // Outputs "120 0052B1CC"
std::wcout << (unsigned)c32 << ' ' << (const void*)p32 << '\n'; // Outputs "120 0052B1D8"
}
Tipo de retorno alterado de Tipo de retorno alterado de std::pow() para para std::complex
O código agora produz estas mensagens de diagnóstico:
Você pode obter o efeito do comportamento antigo em todos os modos de linguagem convertendo tipos de
caracteres para unsigned int , ou tipos de ponteiro para caractere para const void* :
Anteriormente, a implementação de MSVC das regras de promoção para o tipo de retorno do modelo de
função std::pow() estava incorreta. Por exemplo, pow(complex<float>, int) retornado anteriormente
complex<float> . Agora ele retorna corretamente complex<double> . A correção foi implementada
incondicionalmente para todos os modos de padrões no Visual Studio 2019 versão 16,6.
Essa alteração pode causar erros de compilador. Por exemplo, anteriormente você poderia multiplicar
pow(complex<float>, int) por um float . Como complex<T> operator* o espera argumentos do mesmo tipo,
o exemplo a seguir agora emite o erro do compilador C2676:
binary '*': 'std::complex<double>' does not define this operator or a conversion to a type acceptable to the
predefined operator
:
// pow_error.cpp
// compile by using: cl /EHsc /nologo /W4 pow_error.cpp
#include <complex>
int main() {
std::complex<float> cf(2.0f, 0.0f);
(void) (std::pow(cf, -1) * 3.0f);
}
Avisos relacionados ao comutador para CAvisos relacionados ao comutador para C
#include <stdbool.h>
int main() {
bool b = true;
switch (b) {
case true: break;
case false: break;
default: break; // C4809: switch statement has redundant 'default' label;
// all possible 'case' labels are given
}
}
#include <stdbool.h>
int main() {
bool b = true;
switch (b) {
case true: break;
case false: break;
}
}
Classes sem nome em Classes sem nome em typedef declarações declarações
Há muitas correções possíveis:
Altere o tipo de float multiplicando para double . Esse argumento pode ser convertido diretamente
em um complex<double> para corresponder ao tipo retornado por pow .
Restrinja o resultado de pow ao complex<float> dizendo complex<float>{pow(ARG, ARG)} . Em seguida,
você pode continuar a multiplicar por um float valor.
Passe float em vez de int para pow . Esta operação pode ser mais lenta.
Em alguns casos, você pode evitar pow totalmente. Por exemplo, pow(cf, -1) pode ser substituído por
divisão.
A partir do Visual Studio 2019 versão 16,6, o compilador implementa alguns avisos de C++ preexistentes para
o código compilado como C. Os seguintes avisos agora estão habilitados em diferentes níveis: C4060, C4061,
C4062, C4063, C4064, C4065, C4808 e C4809. Os avisos C4065 e C4060 são desabilitados por padrão em C.
O gatilho de avisos sobre case instruções ausentes, indefinidos enum e opções incorretas bool (ou seja,
aquelas que contêm muitos casos). Por exemplo:
Para corrigir esse código, remova o default caso redundante:
A partir do Visual Studio 2019 versão 16,6, o comportamento das typedef declarações foi restrito a estar em
conformidade com o P1766R1. Com esta atualização, as classes sem nome dentro de uma typedef declaração
não podem ter membros diferentes de:
https://wg21.link/P1766R1
struct B { };
typedef struct : B { // inheriting from 'B'; ill-formed
void f(); // ill-formed
static int i; // ill-formed
struct U {
void f(); // nested class has non-data member; ill-formed
};
int j = 10; // default member initializer; ill-formed
} S;
struct B { };
typedef struct S_ : B {
void f();
static int i;
struct U {
void f();
};
int j = 10;
} S;
Importação de argumento padrão em C++/CLIImportação de argumento padrão em C++/CLI
public class R {
public void Func(strings) {} // overload 1
public void Func(string s, string s2 = "") {} // overload 2;
}
(gcnew R)->Func("abc"); // error C2668: 'R::Func' ambiguous call to overloaded function
Membros de dados não estáticos,
classes de membro,
enumerações de membro,
e inicializadores de membro padrão.
As mesmas restrições são aplicadas recursivamente a cada classe aninhada. A restrição destina-se a garantir a
simplicidade de structs que têm typedef nomes para fins de vinculação. Eles devem ser simples o suficiente
para que nenhum cálculo de ligação seja necessário antes que o compilador obtenha o typedef nome para
vinculação.
Essa alteração afeta todos os modos de padrões do compilador. Em padrão ( /std:c++14 ) e /std:c++17
modos, o compilador emite o aviso C5208 para o código não compatível. Se /permissive- for especificado, o
compilador emitirá o aviso C5208 como um erro em /std:c++14 e emitirá o erro C7626 em /std:c++17 . O
compilador emite o erro C7626 para o código não compatível quando /std:c++latest é especificado.
O exemplo a seguir mostra as construções que não são mais permitidas em structs sem nome. Dependendo do
modo de padrões especificado, erros ou avisos C5208 ou C7626 são emitidos:
O código acima pode ser corrigido fornecendo o nome da classe sem nome:
Um número cada vez maior de APIs tem argumentos padrão no .NET Core. É por isso que agora damos suporte
à importação de argumento padrão em C++/CLI. Essa alteração pode interromper o código existente em que
várias sobrecargas são declaradas, como neste exemplo:
Quando essa classe é importada para C++/CLI, uma chamada para uma das sobrecargas causa um erro:
O compilador emite o erro C2668 porque as sobrecargas correspondem a essa lista de argumentos. Na
Melhorias de conformidade no Visual Studio 2019 versão 16,7
A definição de A definição de é trivialmente copiávelé trivialmente copiável
#include <type_traits>
struct S
{
volatile int m;
};
static_assert(std::is_trivially_copyable_v<S>, "Meow!");
Conversões de ponteiro para membro e literal de cadeia de caracteres para Conversões de ponteiro para membro e literal de cadeia de caracteres para bool estão estreitando estão estreitando
struct X { bool b; };
void f(X);
int main() {
f(X { "whoops?" }); // error: conversion from 'const char [8]' to 'bool' requires a narrowing
conversion
int (X::* p) = nullptr;
f(X { p }); // error: conversion from 'int X::*' to 'bool' requires a narrowing conversion
}
segunda sobrecarga, o segundo argumento é preenchido pelo argumento padrão. Para contornar esse
problema, você pode excluir a sobrecarga redundante (1). Ou use a lista completa de argumentos e forneça
explicitamente os argumentos padrão.
O c++ 20 alterou a definição de é trivialmente copiável. Quando uma classe tem um membro de dados não
estático com volatile tipo qualificado, ela não implica mais que qualquer Construtor de cópia ou
movimentação gerado pelo compilador, ou operador de atribuição de cópia ou movimentação, não é trivial. O
Comitê standard do C++ aplicou essa alteração retroativamente como um relatório de defeito. No MSVC, o
comportamento do compilador não é alterado em modos de linguagem diferentes, como /std:c++14 ou
/std:c++latest .
Veja um exemplo do novo comportamento:
Este código não é compilado em versões do MSVC antes do Visual Studio 2019 versão 16,7. Há um aviso de
compilador fora por padrão que você pode usar para detectar essa alteração. Se você compilar o código acima
usando cl /W4 /w45220 o, você verá o seguinte aviso:
C5220 de aviso:
'S::m': a non-static data member with a volatile qualified type no longer implies that compiler generated
copy/move constructors and copy/move assignment operators are non trivial
O Comitê standard do C++ adotou recentemente um relatório de defeito P1957R2, que considera T* ->
bool como uma conversão de restrição. O MSVC corrigiu um bug em sua implementação, que deve ser
diagnosticado anteriormente T* -> bool como restrito, mas não Diagnostique a conversão de um literal de
cadeia de caracteres para bool ou um ponteiro para membro para bool .
O programa a seguir está mal formado no Visual Studio 2019 versão 16,7:
Para corrigir esse código, adicione comparações explícitas nullptr ou Evite contextos em que conversões
redutoras são malformadas:
https://wg21.link/p1957r2
struct X { bool b; };
void f(X);
int main() {
f(X { "whoops?" != nullptr }); // Absurd, but OK
int (X::* p) = nullptr;
f(X { p != nullptr }); // OK
}
nullptr_t Só é conversível Só é conversível bool como uma inicialização direta como uma inicialização direta
struct S { bool b; };
void g(bool);
bool h() { return nullptr; } // error, should be 'return false;'
int main() {
bool b1 = nullptr; // error: cannot convert from 'nullptr' to 'bool'
S s { nullptr }; // error: cannot convert from 'nullptr' to 'bool'
g(nullptr); // error: cannot convert argument 1 from 'nullptr' to 'bool'
bool b2 { nullptr }; // OK: Direct-initialization
if (!nullptr) {} // OK: Contextual conversion to bool
}
Conformidade do comportamento de inicialização para inicializações de matriz com inicializadores ausentesConformidade do comportamento de inicialização para inicializações de matriz com inicializadores ausentes
struct B {
explicit B() {}
};
void f() {
B b1[1]{}; // Error in /permissive-, because aggregate init calls explicit ctor
B b2[1]; // OK: calls default ctor for each array element
}
Melhorias de conformidade no Visual Studio 2019 versão 16,8
No C++ 11, nullptr só é conversível bool como uma conversão direta ; por exemplo, quando você inicializa
um bool usando uma lista de inicializadores de chaves. Essa restrição nunca foi imposta por MSVC. MSVC
agora implementa a regra em /permissive- . Conversões implícitas agora são diagnosticadas como mal
formadas. Uma conversão contextual para bool ainda é permitida, pois a inicialização direta bool b(nullptr)
é válida.
Na maioria dos casos, o erro pode ser corrigido com a substituição por nullptr false , conforme mostrado
neste exemplo:
Anteriormente, MSVC tinha um comportamento não compatível para inicializações de matriz que tinham
inicializadores ausentes. MSVC sempre chamou o construtor padrão para cada elemento de matriz que não
tinha um inicializador. O comportamento padrão é inicializar cada elemento com um colchete de chave-
inicializador vazio ( {} ). O contexto de inicialização para uma lista de chaves-inicializadores vazia é a
inicialização de cópia, o que não permite chamadas para construtores explícitos. Também pode haver diferenças
de tempo de execução, pois {} o uso de para inicializar pode chamar um construtor que usa um
std::initializer_list , em vez do construtor padrão. O comportamento de conformidade é habilitado em
/permissive- .
Veja um exemplo do comportamento alterado:
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
Extensão ' classe rvalue usada como lvalue 'Extensão ' classe rvalue usada como lvalue '
// Compiling with /permissive- now gives:
// error C2102: '&' requires l-value
struct S {};
S f();
void g()
{
auto p1 = &(f()); // The temporary returned by 'f' is destructed after this statement. So 'p1' points
to an invalid object.
const auto &r = f(); // This extends the lifetime of the temporary returned by 'f'
auto p2 = &r; // 'p2' points to a valid object
}
Extensão ' especialização explícita em escopo de não namespace 'Extensão ' especialização explícita em escopo de não namespace '
// Compiling with 'cl a.cpp b.cpp /permissive-' now gives:
// error LNK2005: "public: void __thiscall S::f<int>(int)" (??$f@H@S@@QAEXH@Z) already defined in a.obj
// To fix the linker error,
// 1. Mark the explicit specialization with 'inline' explicitly. Or,
// 2. Move its definition to a source file.
// common.h
struct S {
template<typenameT> void f(T);
template<> void f(int);
};
// This explicit specialization is implicitly inline in the default mode.
template<> void S::f(int) {}
// a.cpp
#include "common.h"
int main() {}
// b.cpp
#include "common.h"
Verificando tipos de classe abstratasVerificando tipos de classe abstratas
MSVC tem uma extensão que permite usar uma classe rvalue como um lvalue. A extensão não estende o
tempo de vida da classe rvalue e pode levar a um comportamento indefinido no tempo de execução. Agora,
vamos impor a regra padrão e não permitir essa extensão em /permissive- . Se você ainda não pode usar
/permissive- , você pode usar /we4238 para proibir explicitamente a extensão. Aqui está um exemplo:
MSVC tinha uma extensão que permitia especialização explícita no escopo não namespace. Agora, ele faz parte
do padrão, após a resolução do CWG 727. No entanto, há diferenças de comportamento. Ajustamos o
comportamento do nosso compilador para alinhar-se com o padrão.
O padrão de C++ 20 alterou o processo pelo qual o uso de um tipo de classe abstrata como um parâmetro de
função é detectado por um compilador. Especificamente, não é mais um erro SFINAE. Anteriormente, se o
compilador detectou que uma especialização de um modelo de função teria um parâmetro de função cujo tipo
era uma instância de um tipo de classe abstrata, essa especialização seria considerada mal formada. Ele não
seria adicionado ao conjunto de funções viáveis. No C++ 20, a verificação de um parâmetro de tipo de classe
abstrata não acontece até que a função seja chamada. Isso significa que o código que costumava ser compilado
não causará um erro. Aqui está um exemplo:
class Node {
public:
int index() const;
};
class String : public Node {
public:
virtual int size() const = 0;
};
class Identifier : public Node {
public:
const String& string() const;
};
template<typename T>
int compare(T x, T y)
{
return x < y ? -1 : (x > y ? 1 : 0);
}
int compare(const Node& x, const Node& y)
{
return compare(x.index(), y.index());
}
int f(const Identifier& x, const String& y)
{
return compare(x.string(), y);
}
template<typename T>
int compare(T x, T y) requires !std::is_abstract_v<T>
{
return x < y ? -1 : (x > y ? 1 : 0);
}
template<typename T, std::enable_if_t<!std::is_abstract_v<T>, int> = 0>
int compare(T x, T y)
{
return x < y ? -1 : (x > y ? 1 : 0);
}
Suporte para P0960R3-permitir a inicialização de agregações de uma lista de valores entre parêntesesSuporte para P0960R3-permitir a inicialização de agregações de uma lista de valores entre parênteses
Anteriormente, a chamada para compare teria tentado especializar o modelo de função compare com o
argumento de modelo para T ser String . Falha ao gerar uma especialização válida, porque String é uma
classe abstrata. O único candidato viável teria sido compare(const Node&, const Node&) . No entanto, em C++
20, a verificação para o tipo de classe abstrata não acontece até que a função seja chamada. Portanto, a
especialização compare(String, String) é adicionada ao conjunto de candidatos viáveis e é escolhida como a
melhor candidata porque a conversão de const String& para String é uma sequência de conversão melhor
do que a conversão de const String& para const Node& .
Em C++ 20, uma correção possível para este exemplo é usar conceitos; ou seja, altere a definição de compare
para:
Ou, se os conceitos do C++ não estiverem disponíveis, você poderá fazer fallback para SFINAE:
O c++ 20 adiciona suporte para inicializar uma agregação usando uma lista de inicializadores entre parênteses.
Por exemplo, o código a seguir é válido em C++ 20:
struct S {
int i;
int j;
};
S s(1, 2);
Resolução de sobrecarga envolvendo modelos de funçãoResolução de sobrecarga envolvendo modelos de função
int f(int);
namespace N
{
using ::f;
template<typename T>
T f(T);
}
template<typename T>
void g(T&& t)
{
}
void h()
{
using namespace N;
g(f);
}
Migrando do Migrando do /await para c++ 20 corrotinas para c++ 20 corrotinas
Palavras-chave não padrãoPalavras-chave não padrão
A maior parte desse recurso é aditiva, ou seja, o código agora compila que não foi compilado antes. No
entanto, ele altera o comportamento de std::is_constructible . No modo C++ 17 static_assert , isso falha,
mas no modo c++ 20 tem êxito:
static_assert(std::is_constructible_v<S, int, int>, "Assertion failed!");
Se essa característica de tipo for usada para controlar a resolução de sobrecarga, ela poderá levar a uma
alteração no comportamento entre C++ 17 e C++ 20.
Anteriormente, o compilador permitia a compilação de algum código /permissive- que não deveria ser
compilado. O efeito foi, o compilador chamou a função incorreta que leva a uma alteração no comportamento
do tempo de execução:
A chamada para g usa um conjunto de sobrecarga que contém duas funções, ::f e N::f . Como N::f é um
modelo de função, o compilador deve tratar o argumento da função como um contexto não deduzido. Isso
significa que, nesse caso, a chamada para g deve falhar, pois o compilador não pode deduzir um tipo para o
parâmetro de modelo T . Infelizmente, o compilador não descartava o fato de que ele já tinha decidido que
::f era uma boa correspondência para a chamada de função. Em vez de emitir um erro, o compilador geraria
código para chamar g usando ::f como argumento.
Considerando que, em muitos casos ::f , usar como o argumento da função é o que o usuário espera, só
emitiremos um erro se o código for compilado com /permissive- .
As corotinas padrão do C++ 20 estão agora ativadas por padrão em /std:c++latest . Eles diferem do TS de
corrotinas e do suporte sob a /await opção. A migração do /await para as corotinas padrão pode exigir
algumas alterações de origem.
await yield Não há suporte para as palavras-chave e antigas no modo c++ 20. O código deve usar
// /await
task f_legacy() {
...
await g();
return n;
}
// /std:c++latest
task f() {
...
co_await g();
co_return n;
}
Tipos de initial_suspend/final_suspendTipos de initial_suspend/final_suspend
// /await
struct promise_type_legacy {
bool initial_suspend() noexcept { return false; }
bool final_suspend() noexcept { return true; }
...
};
// /std:c++latest
struct promise_type {
auto initial_susepend() noexcept { return std::suspend_never{}; }
auto final_suspend() noexcept { return std::suspend_always{}; }
...
};
Tipo de Tipo de yield_value
// /await
struct promise_type_legacy {
...
void yield_value(int x) { next = x; };
};
// /std:c++latest
struct promise_type {
...
auto yield_value(int x) { next = x; return std::suspend_always{}; }
};
Função de tratamento de exceçãoFunção de tratamento de exceção
co_await e co_yield , em vez disso. O modo padrão também não permite o uso de return em uma
corrotina. Cada return um em uma corrotina deve usar co_return .
Em /await , as funções Promise inicial e suspender podem ser declaradas como retornando bool . Esse
comportamento não é padrão. No C++ 20, essas funções devem retornar um tipo de classe awaitable,
geralmente um dos trivial awaitables std::suspend_always se a função retornou anteriormente true ou
std::suspend_never se ela foi retornada false .
No C++ 20, a yield_value função Promise deve retornar um awaitable. No /await modo, a yield_value
função foi permitida para retornar void e sempre suspenderia. Essas funções podem ser substituídas por uma
função que retorna std::suspend_always .
/await o oferece suporte a um tipo de promessa com nenhuma função de tratamento de exceção ou uma
função de tratamento de exceção chamada set_exception que usa um std::exception_ptr . No C++ 20, o tipo
Promise deve ter uma função chamada unhandled_exception que não usa nenhum argumento. O objeto de
exceção pode ser obtido de std::current_exception se necessário.
// /await
struct promise_type_legacy {
void set_exception(std::exception_ptr e) { saved_exception= e; }
...
};
// /std:c++latest
struct promise_type {
void unhandled_exception() { saved_exception = std::current_exception(); }
...
};
Não há suporte para tipos de retorno deduzidos de corrotinasNão há suporte para tipos de retorno deduzidos de corrotinas
// /await
auto my_generator() {
...
co_yield next;
};
// /std:c++latest
#include <experimental/generator>
std::experimental::generator<int> my_generator() {
...
co_yield next;
};
Tipo de retorno de Tipo de retorno de return_value
// /await
struct promise_type_legacy {
...
int return_value(int x) { return x; } // incorrect, the return value of this function is unused and the
value is lost.
};
// /std:c++latest
struct promise_type {
...
void return_value(int x) { value = x; }; // save return value
};
Retornar comportamento de conversão de objetoRetornar comportamento de conversão de objeto
Parâmetros de promessa de interrotinaParâmetros de promessa de interrotina
O c++ 20 não dá suporte a corrotinas com um tipo de retorno que inclui um tipo de espaço reservado como
auto . Tipos de retorno de corrotinas devem ser declarados explicitamente. Em /await , esses tipos deduzidos
sempre envolvem um tipo experimental e exigem a inclusão de um cabeçalho que define o tipo necessário: um
de std::experimental::task<T> , std::experimental::generator<T> ou std::experimental::async_stream<T> .
O tipo de retorno da return_value função Promise deve ser void . No /await modo, o tipo de retorno pode
ser qualquer coisa e é ignorado. Esse diagnóstico pode ajudar a detectar erros sutis em que o autor assume
incorretamente que o valor de retorno de return_value é retornado para um chamador.
Se o tipo de retorno declarado de uma corrotina não corresponder ao tipo de retorno da get_return_object
função Promise, o objeto retornado de get_return_object será convertido no tipo de retorno da corrotina. Em
/await , essa conversão é feita antecipadamente, antes que o corpo da corrotina tenha a chance de ser
executado. No /std:c++latest , essa conversão é executada somente quando o valor é realmente retornado ao
chamador. Ele permite que as corotinas que não suspendem no ponto de suspensão inicial façam uso do objeto
retornado por get_return_object dentro do corpo da corotina.
No C++ 20, o compilador tenta passar os parâmetros de corrotina (se houver) para um construtor do tipo
struct coro {
struct promise_type {
promise_type() { ... }
promise_type(int x) { ... }
...
};
};
coro f1(int x);
// Under /await the promise gets constructed using the default constructor.
// Under /std:c++latest the promise gets constructed using the 1-argument constructor.
f1(0);
struct Object {
template <typename T> operator T() { ... } // Converts to anything!
};
coro f2(Object o);
// Under /await the promise gets constructed using the default constructor
// Under /std:c++latest the promise gets copy- or move-constructed from the result of
// Object::operator coro::promise_type().
f2(Object{});
/permissive- e os módulos do C++ 20 estão ativados por padrão em e os módulos do C++ 20 estão ativados por padrão em /std:c++latest
O P Ç Ã OO P Ç Ã O DESC RIÇ Ã ODESC RIÇ Ã O
/Zc:twoPhase- A pesquisa de nome de duas fases é necessária para os
módulos do C++ 20 e implícita por permissive- .
/Zc:hiddenFriend- Habilita regras de pesquisa de nome de amigo oculto
padrão. Necessário para os módulos do C++ 20 e implícito
pelo permissive- .
/Zc:preprocessor- O pré-processador de conformidade é necessário apenas
para o uso e a criação da unidade de cabeçalho do C++ 20.
Os módulos nomeados não exigem essa opção.
Promise. Se falhar, ele tentará novamente com um construtor padrão. No /await modo, apenas o construtor
padrão foi usado. Essa alteração pode levar a uma diferença no comportamento se a promessa tiver vários
construtores ou se houver uma conversão de um parâmetro de corrotina para o tipo Promise.
O suporte a módulos do c++ 20 está ativado por padrão em /std:c++latest . Para obter mais informações
sobre essa alteração e os cenários em que module e import são tratados condicionalmente como palavras-
chave, consulte suporte a módulos padrão do C++ 20 com MSVC no Visual Studio 2019 versão 16,8.
Como um pré-requisito para suporte a módulos, permissive- agora é habilitado quando /std:c++latest é
especificado. Para obter mais informações, confira /permissive- .
Para o código que foi compilado anteriormente no /std:c++latest e requer comportamentos de compilador
não conformes, permissive pode ser especificado para desativar o modo de conformidade estrito no
compilador. A opção do compilador deve aparecer depois /std:c++latest na lista de argumentos da linha de
comando. No entanto, permissive o resultará em um erro se o uso de módulos for encontrado:
erro C1214: os módulos estão em conflito com o comportamento não padrão solicitado via ' Option '
Os valores mais comuns para a opção são:
https://devblogs.microsoft.com/cppblog/standard-c20-modules-support-with-msvc-in-visual-studio-2019-version-16-8/
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
Correções de bugs e alterações de comportamento no Visual Studio
2019
reinterpret_cast em uma em uma constexpr função função
long long i = 0;
constexpr void f() {
int* a = reinterpret_cast<int*>(i);
}
Diagnóstico correto para o construtor do intervalo basic_stringDiagnóstico correto para o construtor do intervalo basic_string
std::wstring ws = /* … */;
std::string out(ws.begin(), ws.end());
std::wstring ws = L"Hello world";
std::string out;
for (wchar_t ch : ws)
{
out.push_back(static_cast<char>(ch));
}
Chamadas incorretas para Chamadas incorretas para += and and -= sob sob /clr ou ou /ZW agora estão corretamente detectadas agora estão corretamente detectadas
A /experimental:module opção ainda é necessária para usar os std.* módulos fornecidos com o Visual Studio,
porque eles ainda não estão padronizados.
A /experimental:module opção também implica /Zc:twoPhase e /Zc:hiddenFriend . Anteriormente, o código
compilado com módulos às vezes poderia ser compilado com /Zc:twoPhase- se o módulo fosse consumido
apenas. Não há mais suporte para esse comportamento.
Um reinterpret_cast é ilegal em uma constexpr função. O compilador do Microsoft C++ seria rejeitado
anteriormente reinterpret_cast apenas se fosse usado em um constexpr contexto. No Visual Studio 2019,
em todos os modos de padrões de linguagem, o compilador diagnostica corretamente um reinterpret_cast
na definição de uma constexpr função. O código a seguir agora produz C3615:
constexpr function 'f' cannot result in a constant expression .
Para evitar o erro, remova o constexpr modificador da declaração de função.
No Visual Studio 2019, o basic_string Construtor Range não suprime mais o diagnóstico do compilador com
static_cast . O código a seguir é compilado sem avisos no Visual Studio 2017, apesar da possível perda de
dados do wchar_t ao char inicializar out :
O Visual Studio 2019 gera corretamente o aviso C4244:
'argument': conversion from 'wchar_t' to 'const _Elem', possible loss of data . Para evitar o aviso, é possível
inicializar o std::string como mostrado neste exemplo:
Foi introduzido um bug no Visual Studio 2017 que fazia com que o compilador ignorasse silenciosamente os
erros e não gerava nenhum código para as chamadas inválidas para += e -= sob /clr ou /ZW . O código a
seguir compila sem erros no Visual Studio 2017, mas no Visual Studio 2019 ele gera corretamente o erro
C2845: 'System::String ^': pointer arithmetic not allowed on this type :
https://docs.microsoft.com/pt-br/cpp/build/reference/experimental-module
public enum class E { e };
void f(System::String ^s)
{
s += E::e; // C2845 in VS2019
}
Inicializadores de membros de dados estáticos embutidosInicializadores de membros de dados estáticos embutidos
struct X
{
private:
staticinline const int c = 1000;
};
struct Y : X
{
static inline int d = c; // C2248 in Visual Studio 2019
};
struct X
{
protected:
static inline const int c = 1000;
};
C4800 restabelecidoC4800 restabelecido
bool test(IUnknown* p)
{
bool valid = p; // warning C4800: Implicit conversion from 'IUnknown*' to bool. Possible information
loss
IDispatch* d = nullptr;
HRESULT hr = p->QueryInterface(__uuidof(IDispatch), reinterpret_cast<void**>(&d));
return hr; // warning C4165: 'HRESULT' is being converted to 'bool'; are you sure this is what you
want?
}
Para evitar o erro neste exemplo, use o += operador com o ToString() método: s += E::e.ToString(); .
Os acessos a membros inválidos dentro de inline e static constexpr inicializadores agora são detectados
corretamente. O exemplo a seguir compila sem erro no Visual Studio 2017, mas no Visual Studio 2019 em
/std:c++17 modo, ele gera o erro C2248: cannot access private member declared in class 'X' .
Para evitar o erro, declare o membro X::c como protegido:
MSVC costumava ter um aviso de desempenho C4800 sobre a conversão implícita no bool . Ele estava muito
ruidosa e não pôde ser suprimido, levando-nos a removê-lo no Visual Studio 2017. No entanto, durante o ciclo
de vida do Visual Studio 2017, recebemos muitos comentários sobre os casos úteis que ele estava resolvendo.
No Visual Studio 2019, estamos retornando um C4800 cuidadosamente ajustado com o C4165 explicativo.
Ambos os avisos são fáceis de suprimir : usando uma conversão explícita ou por comparação com 0 do tipo
apropriado. O C4800 é um aviso desativado por padrão de nível 4 e o C4165 é um aviso desativado por padrão
de nível 3. Ambos são detectáveis usando a /Wall opção do compilador.
O exemplo a seguir gera C4800 e C4165 em /Wall :
Para evitar os avisos no exemplo anterior, é possível escrever o código da seguinte maneira:
bool test(IUnknown* p)
{
bool valid = p != nullptr; // OK
IDispatch* d = nullptr;
HRESULT hr = p->QueryInterface(__uuidof(IDispatch), reinterpret_cast<void**>(&d));
return SUCCEEDED(hr); // OK
}
A função de membro de classe local não tem um corpoA função de membro de classe local não tem um corpo
void example()
{
struct A
{
int boo(); // warning C4822
};
}
Corpos de modelo de função contendo Corpos de modelo de função contendo if constexpr instruções instruções
template <typename T>
int f()
{
T::Type a; // error C7510
if constexpr (T::val)
{
return 1;
}
else
{
return 2;
}
}
struct X
{
using Type = X;
constexpr static int val = 1;
};
int main()
{
return f<X>();
}
Não há suporte ao código do assembly embutido em uma expressão lambdaNão há suporte ao código do assembly embutido em uma expressão lambda
No Visual Studio 2017, o aviso C4822: Local class member function doesn't have a body é gerado somente
quando a opção do compilador /w14822 é definida explicitamente. Ele não é mostrado com /Wall . No Visual
Studio 2019, C4822 é um aviso desativado por padrão, o que o torna detectável /Wall sem a necessidade de
definir /w14822 explicitamente.
Os corpos de função if constexpr de modelo contendo instruções têm algumas /permissive- verificações
relacionadas à análise habilitadas. Por exemplo, no Visual Studio 2017, o código a seguir produz C7510:
'Type': use of dependent type name must be prefixed with 'typename' somente se a /permissive- opção não
estiver definida. No Visual Studio 2019, o mesmo código gera erros mesmo quando a /permissive- opção é
definida:
Para evitar o erro, adicione a typename palavra-chave à declaração de a : typename T::Type a; .
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
#include <cstdio>
int f()
{
int y = 1724;
int x = 0xdeadbeef;
auto lambda = [&]
{
__asm {
mov eax, x
mov y, eax
}
};
lambda();
return y;
}
A equipe do Microsoft C++ foi recentemente consciente de um problema de segurança no qual o uso de
Assembler embutido em um lambda poderia causar a corrupção de ebp (o registro do endereço de retorno)
em tempo de execução. Um invasor mal-intencionado possivelmente poderia tirar proveito desse cenário. O
Assembler embutido só tem suporte no x86, e a interação entre o Assembler embutido e o restante do
compilador é ruim. Considerando esses fatos e a natureza do problema, a solução mais segura para esse
problema foi não permitir o Assembler embutido dentro de uma expressão lambda.
O único uso do assembler embutido em uma expressão lambda que encontramos “em condições naturais” era
capturar o endereço de retorno. Nesse cenário, é possível capturar o endereço de retorno em todas as
plataformas usando simplesmente um _ReturnAddress() intrínseco do compilador.
O código a seguir produz C7552: inline assembler is not supported in a lambda no visual studio 2017 15,9 e
no visual studio 2019:
Para evitar o erro, mova o código do assembly para uma função nomeada conforme mostrado no exemplo a
seguir :
#include <cstdio>
void g(int& x, int& y)
{
__asm {
mov eax, x
mov y, eax
}
}
int f()
{
int y = 1724;
int x = 0xdeadbeef;
auto lambda = [&]
{
g(x, y);
};
lambda();
return y;
}
int main()
{
std::printf("%d\n", f());
}
Depuração do iterador e Depuração do iterador e std::move_iterator
Correções para <xkeycheck.h> imposição de palavra-chaveCorreções para <xkeycheck.h> imposição de palavra-chave
Tipos de alocador não mais preteridosTipos de alocador não mais preteridos
Aviso correto para restringir conversões de cadeia de caracteresAviso correto para restringir conversões de cadeia de caracteres
Várias correções para <filesystem> exatidãoVárias correções para <filesystem> exatidão
O recurso de depuração do iterador foi ensinado a desencapsular adequadamente o std::move_iterator . Por
exemplo, agora
std::copy(std::move_iterator<std::vector<int>::iterator>, std::move_iterator<std::vector<int>::iterator>,
int*)
pode envolver o caminho memcpy rápido.
A imposição da biblioteca padrão no <xkeycheck.h> para macros que substitui uma palavra-chave foi
corrigida. A biblioteca agora emite a palavra-chave do problema real detectada em vez de uma mensagem
genérica. Ela também dá suporte a palavras-chave do C++20 e evita enganar o IntelliSense dizendo que
palavras-chave são macros.
std::allocator<void> , std::allocator::size_type e std::allocator::difference_type não são mais preteridos.
Removeu um falso static_cast de std::string que não foi chamado pelo padrão e que suprimiva
acidentalmente os avisos de restrição de C4244. As tentativas de chamar
std::string::string(const wchar_t*, const wchar_t*) agora emitem corretamente o C4244
narrowing a wchar_t into a char .
Correção de std::filesystem::last_write_time falha ao tentar alterar a hora da última gravação do
diretório.
O construtor std::filesystem::directory_entry agora armazena um resultado com falha, em vez de gerar
uma exceção, quando um caminho de destino não existente é fornecido.
A versão de dois parâmetros std::filesystem::create_directory foi alterada para chamar a versão de um
parâmetro, pois a função CreateDirectoryExW subjacente usaria copy_symlink quando existing_p fosse um
symlink.
Algoritmos paralelos no Windows 8 e posteriorAlgoritmos paralelos no Windows 8 e posterior
Espaço em branco em Espaço em branco em std::system_category::message()
Divisão por zero em Divisão por zero em std::linear_congruential_engine
Correções para desencapsulamento do iteradorCorreções para desencapsulamento do iterador
Manipulação de tempoManipulação de tempo
Várias correções de contêineresVárias correções de contêineres
std::filesystem::directory_iterator não falha mais quando um symlink corrompido é encontrado.
std::filesystem::space agora aceita caminhos relativos.
std::filesystem::path::lexically_relativenão é mais confundido com barras à direita, relatado como LWG
3096.
Solução de CreateSymbolicLinkW que rejeitava caminhos com barras à esquerda em
std::filesystem::create_symlink .
Trabalhou na função do modo de exclusão do POSIX delete que existia no Windows 10 LTSB 1609, mas
não podia realmente excluir arquivos.
Os operadores de atribuição de cópia e construtores de cópia do std::boyer_moore_searcher e do
std::boyer_moore_horspool_searcher agora realmente copiam coisas.
A biblioteca de algoritmos paralelos agora usa devidamente a família WaitOnAddress real no Windows 8 e
posterior, em vez de sempre usar o Windows 7 e versões falsas anteriores.
std::system_category::message() agora corta o espaço em branco à direita da mensagem retornada.
Algumas condições que poderiam fazer std::linear_congruential_engine disparar a divisão por 0 foram
corrigidas.
Algumas máquinas de iterador-desencapsulamento foram expostas primeiro para a integração de usuário do
programador no Visual Studio 2017 15,8. Ele foi descrito no artigo do blog da equipe do C++ recursos STL e
correções no VS 2017 15,8. Essa maquina não desenvolve mais os iteradores derivados dos iteradores de
biblioteca padrão. Por exemplo, um usuário derivado de std::vector<int>::iterator e que tenta personalizar o
comportamento agora obtém seu comportamento personalizado ao chamar algoritmos de biblioteca padrão,
em vez do comportamento de um ponteiro.
Agora, a função reserve de contêiner não ordenada na verdade reserva N elementos, conforme descrito em
LWG 2156.
Anteriormente, alguns valores temporais que eram passados para a biblioteca de simultaneidade
estourariam, por exemplo, condition_variable::wait_for(seconds::max()) . Agora corrigidos, os estouros
mudaram o comportamento em um ciclo aparentemente aleatório de 29 dias (quando uint32_t
milissegundos aceitos pelas APIs do Win32 subjacentes estouravam).
O <ctime> cabeçalho agora declara timespec e timespec_get no namespace corretamente std e
também os declara no namespace global.
Muitas funções de contêiner interno da biblioteca padrão tornaram-se privadas para uma experiência
aprimorada do IntelliSense. Outras correções para marcar membros como privados são esperadas em
versões posteriores do MSVC.
Problemas de exatidão de segurança de exceção nos quais contêineres baseados em nós, como list ,
map e unordered_map , se tornariam corrompidos foram corrigidos. Durante uma
propagate_on_container_copy_assignment propagate_on_container_move_assignment operação ou
reatribuição, liberamos o nó Sentinel do contêiner com o alocador antigo, fazemos a atribuição de
POCCA/POCMA sobre o alocador antigo e, em seguida, tentamos adquirir o nó Sentinel do novo
alocador. Se essa alocação falhou, o contêiner estava corrompido. Ele não poderia até ser destruído, pois
https://cplusplus.github.io/LWG/issue3096
https://devblogs.microsoft.com/cppblog/stl-features-and-fixes-in-vs-2017-15-8/
https://cplusplus.github.io/LWG/issue2156
std::basic_istream::read processamento de processamento de \r\n`` => \n ' \n '
Construtor Construtor std::bitset
Regressão de Regressão de std::pair::operator=
Contextos não deduzidos para Contextos não deduzidos para add_const_t
Correções de bugs e alterações de comportamento em 16,2
Comparadores const para contêineres associativosComparadores const para contêineres associativos
a propriedade de um nó Sentinela é uma invariável de estrutura de dados rígido. Esse código foi
corrigido para criar o novo nó Sentinel usando o alocador do contêiner de origem antes de destruir o nó
sentinela existente.
Os contêineres foram corrigidos para alocadores sempre copiar/mover/trocar de acordo com
propagate_on_container_copy_assignment , propagate_on_container_move_assignment e
propagate_on_container_swap , mesmo para alocadores declarados is_always_equal .
Foram adicionadas sobrecargas para mesclagem de contêiner e extração de funções de membro que
aceitam contêineres rvalue. Para obter mais informações, consulte o P0083 "mapas e conjuntos do da
União"
std::basic_istream::read foi corrigido para não gravar em partes do buffer fornecido temporariamente como
parte do \r\n => \n processamento. Essa alteração perde um pouco da vantagem de desempenho que foi
obtida no Visual Studio 2017 15.8 para leituras com mais de 4 K. No entanto, as melhorias na eficiência
evitando três chamadas virtuais por caractere ainda estão presentes.
O construtor std::bitset não lê mais os numerais um e zero em ordem inversa em conjuntos de bits grandes.
Correção de uma regressão no operador de atribuição do std::pair introduzida ao implementar LWG 2729
"SFINAE ausente em std::pair ::operator =";. Ele agora aceita corretamente tipos conversíveis em std::pair
novamente.
Correção de um bug de características de tipo secundário, em que add_const_t e funções relacionadas devem
ser um contexto não deduzido. Em outras palavras, add_const_t deve ser um alias para
typename add_const<T>::type , e não const T .
O código para pesquisa e inserção em set, map ,e Multimap foi mesclado para tamanho de código reduzido.
map As operações de inserção agora chamam a comparação de menor que em um const functor de
comparação, da mesma forma que as operações de pesquisa foram feitas anteriormente. O código a seguir é
compilado no Visual Studio 2019 versão 16,1 e anterior, mas gera C3848 no Visual Studio 2019 versão 16,2:
https://wg21.link/p0083r3
https://cplusplus.github.io/LWG/issue2729
https://docs.microsoft.com/pt-br/cpp/standard-library/set-class
https://docs.microsoft.com/pt-br/cpp/standard-library/multiset-class
https://docs.microsoft.com/pt-br/cpp/standard-library/multimap-class
https://docs.microsoft.com/pt-br/cpp/standard-library/map-class
#include <iostream>
#include <map>
using namespace std;
struct K
{
int a;
string b = "label";
};
struct Comparer {
bool operator() (K a, K b) {
return a.a < b.a;
}
};
map<K, double, Comparer> m;
K const s1{1};
K const s2{2};
K const s3{3};
int main() {
m.emplace(s1, 1.08);
m.emplace(s2, 3.14);
m.emplace(s3, 5.21);
}
struct Comparer {
bool operator() (K a, K b) const {
return a.a < b.a;
}
};
Correções de bugs e alterações de comportamento no Visual Studio
2019 versão 16,7
A inicialização de membros de classe com nomes sobrecarregados está sequenciada corretamenteA inicialização de membros de classe com nomes sobrecarregados está sequenciada corretamente
// Compiling with /w15038 now gives:
// warning C5038: data member 'Outer::Inner' will be initialized after data member 'Outer::v'
struct Outer {
Outer(int i, int j) : Inner{ i }, v{ j } {}
struct Inner { int x; };
int v;
Inner Inner; // 'Inner' is both a type name and data member name in the same scope
};
Para evitar o erro, torne o operador de comparação const :
Identificamos um bug na representação interna dos membros de dados de classe quando um nome de tipo
também é sobrecarregado como o nome de um membro de dados. Esse bug causou inconsistências na
inicialização agregada e na ordem de inicialização do membro. O código de inicialização gerado agora está
correto. No entanto, essa alteração pode levar a erros ou avisos na fonte que dependam inadvertidamente dos
membros com ordem incorreta, como neste exemplo:
Resolução de sobrecarga envolvendo sobrecargas e Resolução de sobrecarga envolvendo sobrecargas e long argumentos integral argumentos integral
void f(long long);
void f(int);
int main() {
long x {};
f(x); // error: 'f': ambiguous call to overloaded function
f(static_cast<int>(x)); // OK
}
Uso de variável indefinida com ligação internaUso de variável indefinida com ligação interna
namespace {
extern int x; // Not a definition, but has internal linkage because of the anonymous namespace
}
int main()
{
return x; // Use of 'x' that no other translation unit can possibly define.
}
Conversões de tipo completo e de ponteiro derivadas para baseConversõesde tipo completo e de ponteiro derivadas para base
Em versões anteriores, o Construtor inicializaria incorretamente o membro de dados Inner antes do membro
de dados v . (O padrão C++ requer uma ordem de inicialização que seja igual à ordem de declaração dos
membros). Agora que o código gerado segue o padrão, o membro-init-List está fora de ordem. O compilador
gera um aviso para este exemplo. Para corrigi-lo, reordene a lista de inicializadores de membro para refletir a
ordem da declaração.
O padrão C++ exige a classificação de a long para int conversão como uma conversão padrão. Os
compiladores MSVC anteriores o classificam incorretamente como uma promoção integral, que classifica mais
para resolução de sobrecarga. Essa classificação pode fazer com que a resolução de sobrecarga seja resolvida
com êxito quando deve ser considerada ambígua.
O compilador agora considera a classificação corretamente no /permissive- modo. O código inválido é
diagnosticado corretamente, como neste exemplo:
Você pode corrigir esse problema de várias maneiras:
No local de chamada, altere o tipo do argumento passado para int . Você pode alterar o tipo de
variável ou convertê-lo.
Se houver muitos sites de chamada, você poderá adicionar outra sobrecarga que usa um long
argumento. Nessa função, converta e encaminhe o argumento para a int sobrecarga.
Versões do MSVC antes do Visual Studio 2019 versão 16,7 aceitam o uso de uma variável declarada extern
que tinha ligação interna e não foi definida. Essas variáveis não podem ser definidas em nenhuma outra
unidade de tradução e não podem formar um programa válido. O compilador agora diagnostica esse caso no
momento da compilação. O erro é semelhante ao erro para funções estáticas indefinidas.
Este programa foi compilado e vinculado anteriormente, mas agora emitirá:
erro C7631: 'anonymous-namespace'::x': variable with internal linkage declared but not defined
Essas variáveis devem ser definidas na mesma unidade de tradução em que são usadas. Por exemplo, você
pode fornecer um inicializador explícito ou uma definição separada.
Em padrões do C++ antes do C++ 20, uma conversão de uma classe derivada em uma classe base não exigia
que a classe derivada fosse um tipo de classe completo. O Comitê standard do C++ aprovou uma alteração de
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
template<typename A, typename B>
struct check_derived_from
{
static A a;
static constexpr B* p = &a;
};
struct W { };
struct X { };
struct Y { };
// With this change this code will fail as Z1 is not a complete class type
struct Z1 : X, check_derived_from<Z1, X>
{
};
// This code failed before and it will still fail after this change
struct Z2 : check_derived_from<Z2, Y>, Y
{
};
// With this change this code will fail as Z3 is not a complete class type
struct Z3 : W
{
check_derived_from<Z3, W> cdf;
};
Conversões redutoras são diagnosticadas de forma mais consistenteConversões redutoras são diagnosticadas de forma mais consistente
enum E : long long { e1 };
struct S { int i; };
void f(E e) {
S s = { e }; // warning: conversion from 'E' to 'int' requires a narrowing conversion
S s1 = { static_cast<int>(e) }; // Suppress warning with explicit conversion
}
Melhorias de conformidade no Visual Studio 2017 RTW (versão 15,0)
relatório de defeito retroativa que se aplica a todas as versões da linguagem C++. Essa alteração alinha o
processo de conversão com características de tipo, como std::is_base_of , que exigem que a classe derivada
seja um tipo de classe completo.
Aqui está um exemplo:
Essa alteração de comportamento se aplica a todos os modos de linguagem C++ de MSVC, não apenas
/std:c++latest .
MSVC emite um aviso para restringir conversões em um inicializador de lista de chaves. Anteriormente, o
compilador não diagnosticaria conversões estreitas de enum tipos subjacentes maiores para tipos integrais
mais estreitos. (O compilador considera incorretamente uma promoção integral em vez de uma conversão). Se
a conversão de restrição for intencional, você poderá evitar o aviso usando um static_cast no argumento do
inicializador. Ou escolha um tipo de integral de destino maior.
Aqui está um exemplo de como usar um explícito static_cast para resolver o aviso:
Com suporte para constexpr NSDMI (inicialização de membro de dados) generalizada e não estática para
agregações, o compilador do Microsoft C++ no Visual Studio 2017 agora está completo para os recursos
adicionados no padrão C++ 14. No entanto, o compilador ainda não tem alguns recursos dos padrões C++11
e C++98. Consulte a tabela de conformidade da linguagem Microsoft C++ para obter uma tabela que mostra o
C++ 11: suporte ao Expression SFINAE em mais bibliotecasC++ 11: suporte ao Expression SFINAE em mais bibliotecas
C++ 14: NSDMI para agregaçõesC++ 14: NSDMI para agregações
C++ 14: estendido C++ 14: estendido constexpr
C++ 17: conciso C++ 17: conciso static_assert
C++17: atributo C++17: atributo [[fallthrough]]
Generalizados baseados em intervalo para loopsGeneralizados baseados em intervalo para loops
Melhorias de conformidade no 15,3
constexpr Lambdas Lambdas
if constexpr em modelos de função em modelos de função
Instruções de seleção com inicializadoresInstruções de seleção com inicializadores
Atributos Atributos [[maybe_unused]] e e [[nodiscard]]
estado atual do compilador.
O compilador continua a melhorar seu suporte para o Expression SFINAE. Ele é necessário para dedução de
argumento de modelo e substituição onde decltype e constexpr as expressões podem aparecer como
parâmetros de modelo. Para obter mais informações, consulte Expression SFINAE improvements in Visual
Studio 2017 RC (Melhorias da expressão SFINAE no Visual Studio 2017 RC).
Uma agregação é uma matriz ou uma classe que tem: nenhum construtor fornecido pelo usuário, nenhum
membro de dados não estático privado ou protegido, nenhuma classe base e nenhuma função virtual. A partir
do C++ 14, as agregações podem conter inicializadores de membro. Para obter mais informações, consulte
Member initializers and aggregates (Inicializadores de membro e agregações).
As expressões declaradas como constexpr agora podem conter determinados tipos de declarações, instruções
IF e switch, instruções de loop e mutação de objetos cujo tempo de vida começou dentro da constexpr
avaliação da expressão. Não há mais um requisito de que uma constexpr função de membro não estática deva
ser implicitamente const . Para obter mais informações, consulte relaxando restrições em constexpr funções.
o parâmetro de mensagem para static_assert é opcional. Para obter mais informações, consulte Extending
static_assert, v2 (Estendendo static_assert, v2).
No /std:c++17 modo, o [[fallthrough]] atributo pode ser usado no contexto de instruções switch como uma
dica para o compilador que o comportamento de passagem é pretendido. Esse atributo impede o compilador
de emitir avisos em tais casos. Para obter mais informações, consulte palavras para o [[fallthrough]] atributo.
Loops for baseados em intervalo não exigem mais que begin() e end() retornem objetos do mesmo tipo.
Essa mudança permite que end() retorne uma sentinela conforme usado pelos intervalos em range-v3 e na
Especificação Técnica de Intervalos concluída, mas não completamente publicada. Para obter mais informações,
consulte generalizando o for Loop de Range-Based.
Expressões Lambda agora podem ser usadas em expressões de constante. Para obter mais informações,
consulte constexpr expressões lambda em C++.
Um modelo de função pode conter if constexpr instruções para habilitar a ramificação em tempo de
compilação. Para obter mais informações, consulte if constexpr instruções.
Uma if instrução pode incluir um inicializador que apresenta uma variável no escopo do bloco dentro da
própria instrução. Para obter mais informações, consulte if instruções com inicializador.
O novo atributo [[maybe_unused]]silencia avisos quando uma entidade não é usada. O atributo [[nodiscard]]
criará um aviso se o valor retornado de uma chamada de função for descartado. Para saber mais, veja Atributos
https://devblogs.microsoft.com/cppblog/expression-sfinae-improvements-in-vs-2015-update-3/
https://wg21.link/n3605
https://wg21.link/n3652
https://wg21.link/n3928
https://wg21.link/p0188r0
https://github.com/ericniebler/range-v3
https://wg21.link/p0184r0
https://docs.microsoft.com/pt-br/cpp/cpp/lambda-expressions-constexpr
https://docs.microsoft.com/pt-br/cpp/cpp/if-else-statement-cpp
https://docs.microsoft.com/pt-br/cpp/cpp/if-else-statement-cpp
https://docs.microsoft.com/pt-br/cpp/cpp/attributes
Uso de namespaces de atributo sem repetiçãoUso de namespaces de atributo sem repetição
Associações estruturadasAssociações estruturadas
Regras de construção para valores Regras de construção para valores enum class
Capturar Capturar *this por valor por valor
Remover Remover operator++ para para bool
Remover a palavra-chave Remover a palavra-chave register preterida preterida
Melhorias de conformidade no 15,5
Nova opção de compilador para Nova opção de compilador para extern constexpr
Remover especificações de exceção dinâmicaRemover especificações de exceção dinâmica
not_fn()
Reescrever Reescrever enable_shared_from_this
em C++.
Nova sintaxe para permitir apenas um único identificador de namespace em uma lista de atributos. Para saber
mais, veja Atributos em C++.
Agora é possível, em uma única declaração, armazenar um valor com nomes individuais de seus componentes,
quando o valor é uma matriz, um std::tuple ou std::pair , ou tem todos os membros de dados não estáticos
públicos. Para saber mais, veja Associações estruturadas e Retornar vários valores de uma função.
Agora há uma conversão implícita para enumerações com escopo que não são restritas. Ele converte de um
tipo subjacente de enumeração com escopo para a própria enumeração. A conversão está disponível quando
sua definição não introduz um enumerador e quando a origem usa uma sintaxe de inicialização de lista. Para
saber mais, veja Regras de construção para valores de classe de enumeraçãoeEnumerações.
O *this objeto em uma expressão lambda agora pode ser capturado por valor. Essa mudança permite
cenários nos quais o lambda é invocado em operações paralelas e assíncronas, especialmente em arquiteturas
de computadores mais recentes. Para obter mais informações, consulte captura de lambda disso * por valor
como [ =, * isso ] .
operator++ Não é mais suportado em bool tipos. Para saber mais, veja Remover operator++(bool) preterido.
A register palavra-chave, anteriormente preterida (e ignorada pelo compilador), agora é removida da
linguagem. Para obter mais informações, consulte remover o uso preterido da register palavra-chave.
Os recursos marcados com [ 14] estão disponíveis incondicionalmente até mesmo no /std:c++14 modo.
Em versões anteriores do Visual Studio, o compilador sempre deu um constexpr vínculo interno de variável,
mesmo quando a variável foi marcada extern . No Visual Studio 2017 versão 15,5, uma nova opção de
compilador, /Zc:externConstexpr , habilita o comportamento correto e de conformidade com os padrões. Para
obter mais informações, consulte vinculação de contexpr externo.
P0003R5 As especificações de exceções dinâmicas foram preteridas no C++11. O recurso foi removido do
C++17, mas a especificação throw() (ainda) preterida é mantida estritamente como um alias para
noexcept(true) . Para obter mais informações, consulte Remoção de especificação de exceção dinâmica e
noexcept.
P0005R4 not_fn é uma substituição de not1 e not2 .
P0033R1 enable_shared_from_this foi adicionada no C++ 11. O padrão C++17 atualiza a especificação para
lidar melhor com certos casos de canto. [140
https://docs.microsoft.com/pt-br/cpp/cpp/attributes
https://wg21.link/p0144r0
https://docs.microsoft.com/pt-br/cpp/cpp/functions-cpp
https://wg21.link/p0138r2
https://docs.microsoft.com/pt-br/cpp/cpp/enumerations-cpp
https://wg21.link/p0018r3
https://wg21.link/p0002r1
https://wg21.link/p0001r1
https://docs.microsoft.com/pt-br/cpp/build/reference/zc-externconstexpr
https://wg21.link/p0003r5
https://wg21.link/p0005r4
https://wg21.link/p0033r1
Unir mapas e conjuntosUnir mapas e conjuntos
Preterir partes residuais da bibliotecaPreterir partes residuais da biblioteca
Remover o suporte ao alocador em Remover o suporte ao alocador em std::function
Correções para Correções para not_fn()
shared_ptr<T[]> , , shared_ptr<T[N]>
Corrigir Corrigir shared_ptr para matrizes para matrizes
Esclarecer Esclarecer insert_return_type
Variáveis embutidas para a biblioteca padrãoVariáveis embutidas para a biblioteca padrão
Recursos preteridos do anexo DRecursos preteridos do anexo D
Melhorias de conformidade no 15,6
Princípios básicos da biblioteca C++17 V1Princípios básicos da biblioteca C++17 V1
P0083R3 Esse recurso permite a extração de nós de contêineres associativos (ou seja,,,, map set
unordered_map unordered_set ) que podem ser modificados e inseridos novamente no mesmo contêiner ou
em um contêiner diferente que usa o mesmo tipo de nó. (É um caso de uso comum extrair um nó de um
std::map , alterar a chave e inseri-lo novamente.)
P0174R2 Vários recursos da biblioteca padrão do C++ foram substituídos por novos recursos ao longo dos
anos, ou porque não se mostraram úteis, ou porque apresentaram problemas. Esses recursos foram
oficialmente preteridos no C++17.
P0302R1 Antes do C++ 17, o modelo de classe std::function tinha vários construtores que pegavam um
argumento de alocador. No entanto, o uso de alocadores neste contexto era problemático e a semântica era
confusa. Os construtores de problema foram removidos.
P0358R1 A nova expressão para std::not_fn dão suporte à propagação de categoria de valor quando usada
na invocação do wrapper.
P0414R2 Mesclando alterações do shared_ptr dos Princípios básicos de biblioteca para o C++17. [140
P0497R0 Correções para o suporte de shared_ptr para matrizes. [140
P0508R0 Os contêineres associativos e não ordenados, ambos com chaves exclusivas, têm uma função de
membro insert que retorna um tipo aninhado insert_return_type . O tipo de retorno agora é definido como
uma especialização de um tipo com parâmetros no iterador e NodeType do contêiner.
P0607R0
O anexo D do C++ padrão contém todos os recursos que foram preteridos, incluindo shared_ptr::unique() ,
<codecvt> e namespace std::tr1 . Quando a /std:c++17 opção do compilador é definida, quase todos os
recursos de biblioteca padrão no anexo D são marcados como preteridos. Para obter mais informações,
consulte recursos de biblioteca padrão no anexo D são marcados como preteridos.
O std::tr2::sys namespace no <experimental/filesystem> agora emite um aviso de reprovação sob
/std:c++14 por padrão e agora é removido sob /std:c++17 por padrão.
Melhoria na conformidade em <iostream> , evitando uma extensão não padrão (especializações explícitas na
classe).
A biblioteca padrão agora usa modelos de variável internamente.
A biblioteca padrão foi atualizada em resposta às alterações do compilador C++ 17. As atualizações incluem a
adição de noexcept no sistema de tipos e a remoção de especificações dinâmicas de exceção.
https://wg21.link/p0083r3
https://wg21.link/p0174r2
https://wg21.link/p0302r1
https://wg21.link/p0358r1
https://wg21.link/p0414r2
https://wg21.link/p0497r0
https://wg21.link/p0508r0
https://wg21.link/p0607r0
C++ 17: melhorando a dedução de argumento de modelo de classe para a biblioteca padrãoC++ 17: melhorando a dedução de argumento de modelo de classe para a biblioteca padrão
Melhorias de conformidade no 15,7
C++ 17: repalavras que herdam construtoresC++ 17: repalavras que herdam construtores
struct A {
template<typename T>
A(T, typename T::type = 0);
A(int);
};
struct B : A {
using A::A;
B(int n) = delete; // Error C2280
};
B b(42L); // Calls B<long>(long),which calls A(int)
// due to substitution failure in A<long>(long).
struct A {
template<typename T>
A(T, typename T::type = 0);
A(int);
};
struct B : A {
using A::A;
B(int n)
{
//do something
}
};
B b(42L); // now calls B(int)
C++ 17: inicialização de agregação estendidaC++ 17: inicialização de agregação estendida
O P0220R1 incorpora a especificação técnica dos princípios básicos da biblioteca para o C++17 no padrão.
Aborda atualizações para,,,,,, <experimental/tuple> <experimental/optional> <experimental/functional>
<experimental/any> <experimental/string_view> <experimental/memory>
<experimental/memory_resource> e <experimental/algorithm> .
O P0739R0 move o adopt_lock_t para a frente da lista de parâmetros para scoped_lock a fim de habilitar o
uso consistente de scoped_lock . Permite que o construtor std::variant participe na resolução de sobrecarga
em mais casos para habilitar a atribuição de cópia.
P0136R1 especifica que uma using declaração que nomeia um Construtor agora faz com que os construtores
de classe base correspondentes fiquem visíveis para inicializações da classe derivada, em vez de declarar
construtores de classe derivados adicionais. Essa reformulação é uma mudança a partir do C++14. No Visual
Studio 2017 versão 15,7 e posterior, no /std:c++17 modo, o código que é válido no c++ 14 e usa construtores
de herança pode não ser válido ou ter semânticas diferentes.
O exemplo a seguir mostra o comportamento do C++14:
O exemplo a seguir mostra o /std:c++17 comportamento no Visual Studio 15,7:
Para saber mais, veja Construtores.
P0017R1
https://wg21.link/p0220r1
https://wg21.link/p0739r0
https://wg21.link/p0136r1
https://docs.microsoft.com/pt-br/cpp/cpp/constructors-cpp
https://wg21.link/p0017r1
struct Derived;
struct Base {
friend struct Derived;
private:
Base() {}
};
struct Derived : Base {};
Derived d1; // OK. No aggregate init involved.
Derived d2 {}; // OK in C++14: Calls Derived::Derived()
// which can call Base ctor.
struct Derived;
struct Base {
friend struct Derived;
private:
Base() {}
};
struct Derived : Base {
Derived() {} // add user-defined constructor
// to call with {} initialization
};
Derived d1; // OK. No aggregate init involved.
Derived d2 {}; // error C2248: 'Base::Base': cannot access
// private member declared in class 'Base'
C++ 17: declarando parâmetros de modelo sem tipo com autoC++ 17: declarando parâmetros de modelo sem tipo com auto
template <auto x> constexpr auto constant = x;
auto v1 = constant<5>; // v1 == 5, decltype(v1) is int
auto v2 = constant<true>; // v2 == true, decltype(v2) is bool
auto v3 = constant<'a'>; // v3 == 'a', decltype(v3) is char
Se o construtor de uma classe base for não público, mas estiver acessível a uma classe derivada, em
/std:c++17 modo no Visual Studio 2017 versão 15,7, você não poderá mais usar chaves vazias para inicializar
um objeto do tipo derivado. O exemplo a seguir mostra o comportamento de conformidade do C++14:
No C++ 17, Derived agora é considerado um tipo de agregação. Isso significa que a inicialização de Base por
meio do construtor padrão privado acontece diretamente como parte da regra de inicialização de agregação
estendida. Anteriormente, o construtor privado Base era chamado por meio do construtor Derived , e isso era
bem-sucedido devido à declaração friend. O exemplo a seguir mostra o comportamento do C++ 17 no Visual
Studio versão 15,7 no /std:c++17 modo:
P0127R2
No /std:c++17 modo, o compilador agora pode deduzir o tipo de um argumento de modelo não tipo que é
declarado com auto :
Um impacto desse novo recurso é que um código válido do C++14 pode não ser válido ou pode ter semântica
diferente. Por exemplo, algumas sobrecargas que anteriormente eram inválidas, agora são válidas. O exemplo a
seguir mostra um código do C++14 que é compilado porque a chamada a example(p) está associada a
example(void*); . No Visual Studio 2017 versão 15,7, no /std:c++17 modo, o example modelo de função é a
melhor correspondência.
https://wg21.link/p0127r2
template <int N> struct A;
template <typename T, T N> int example(A<N>*) = delete;
void example(void *);
void sample(A<0> *p)
{
example(p); // OK in C++14
}
template <int N> struct A;
template <typename T, T N> int example(A<N>*);
void example(void *);
void sample(A<0> *p)
{
example(p); // C2280: 'int example<int,0>(A<0>*)': attempting to reference a deleted function
}
C++ 17: conversões elementares de cadeia de caracteres (parcial)C++ 17: conversões elementares de cadeia de caracteres (parcial)
C++ 20: evitando decaimento desnecessárias (parcial)C++ 20: evitando decaimento desnecessárias (parcial)
C++ 17: algoritmos paralelosC++ 17: algoritmos paralelos
C++17: C++17: hypot(x, y, z)
C++17: <filesystem>C++17: <filesystem>
C++ 17: funções especiais matemáticasC++ 17: funções especiais matemáticas
C++ 17: guias de dedução para a biblioteca padrãoC++ 17: guias de dedução para a biblioteca padrão
C++ 17: reparar conversões de cadeia de caracteres elementaresC++ 17: reparar conversões de cadeia de caracteres elementares
C++17: C++17: constexpr para para char_traits (parcial) (parcial)
O exemplo a seguir mostra o código C++ 17 no Visual Studio 15,7 no /std:c++17 modo:
P0067R5 funções de nível baixo, independentes de localidade para conversões entre cadeias de caracteres e
inteiros e entre cadeias de caracteres e números de ponto flutuante.
P0777R1 Adiciona diferenciação entre o conceito de "decaimento" e o da simples remoção de const ou de
qualificadores de referência. A característica de novo tipo de remove_reference_t substitui decay_t em alguns
contextos. O suporte a remove_cvref_t é implementado no Visual Studio 2019.
P0024R2 A TS de paralelismo será incorporada no padrão, com pequenas modificações.
P0030R1 Adiciona três novas sobrecargas para std::hypot , para tipos float , double e long double , cada
uma delas tem três parâmetros de entrada.
P0218R1 Adota a TS do sistema de arquivos no padrão, com algumas modificações de frase.
P0226R1 Adota especificações técnicas anteriores para funções especiais matemáticas no cabeçalho padrão
<cmath> .
P0433R2 Atualizações ao STL para aproveitar a adoção do P0091R3 pelo C++17, que adiciona suporte à
dedução de argumento de modelo de classe.
P0682R1 Mova as novas funções de conversão de cadeia de caracteres elementares do P0067R5 para um novo
cabeçalho <charconv> e faça outras melhorias, incluindo a alteração do tratamento de erro a ser usado
std::errc em vez de std::error_code .
P0426R1 Alterações em std::traits_type funções de membro length , compare e find para tornar
https://wg21.link/p0067r5
https://wg21.link/p0777r1
https://wg21.link/p0024r2
https://wg21.link/p0030r1
https://wg21.link/p0218r1
https://wg21.link/p0220r1
https://wg21.link/p0433r2
https://wg21.link/p0091r3
https://wg21.link/p0682r1
https://wg21.link/p0426r1
Melhorias de conformidade no 15,9
Ordem de avaliação da esquerda para a direita para os operadores Ordem de avaliação da esquerda para a direita para os operadores ->* , , [] , , >> e e <<
// C4866.cpp
// compile with: /w14866 /std:c++17
class HasCopyConstructor
{
public:
int x;
HasCopyConstructor(int x) : x(x) {}
HasCopyConstructor(const HasCopyConstructor& h) : x(h.x) { }
};
int operator>>(HasCopyConstructor a, HasCopyConstructor b) { return a.x >> b.x; }
// This version of operator>> does not trigger the warning:
// int operator>>(const HasCopyConstructor& a, const HasCopyConstructor& b) { return a.x >> b.x; }
int main()
{
HasCopyConstructor a{ 1 };
HasCopyConstructor b{ 2 };
a>>b; // C4866 for call to operator>>
};
Correções de bugs no Visual Studio 2017 RTW (versão 15.0)
Inicialização de lista de cópiaInicialização de lista de cópia
std::string_view utilizáveis em expressões constantes. (No Visual Studio 2017 versão 15.6,compatível
somente com Clang/LLVM. Na versão 15.7 Preview 2, há compatibilidade quase concluída com ClXX também).
A partir do C++17, os operandos dos operadores ->* , [] , >> e << devem ser avaliados na ordem da
esquerda para a direita. Há dois casos em que o compilador não conseguirá garantir esta ordem:
quando uma das expressões do operando é um objeto passado por valor ou que contém um objeto
passado por valor ou
Quando compilado usando /clr , e um dos operandos é um campo de um objeto ou um elemento de
matriz.
O compilador emite um aviso C4866 quando não é capaz de garantir a avaliação da esquerda para a direita. O
compilador gera esse aviso somente se /std:c++17 ou mais tarde for especificado, pois o requisito de ordem
da esquerda para a direita desses operadores foi introduzido em c++ 17.
Para resolver esse aviso, primeiro considere se a avaliação da esquerda para a direita dos operandos é
necessária. Por exemplo, pode ser necessário quando a avaliação dos operandos puder produzir efeitos
colaterais dependentes de ordem. A ordem na qual os operandos são avaliados não tem nenhum efeito
observável em muitos casos. Se a ordem da avaliação precisar ser da esquerda para a direita, considere se não
é possível passar os operandos por referência const. Essa alteração elimina o aviso no seguinte exemplo de
código:
O Visual Studio 2017 gera corretamente erros de compilador relacionados à criação de objetos usando listas de
inicializadores. Esses erros não foram capturados no Visual Studio 2015 e podem levar a falhas ou
comportamento indefinido do tempo de execução. De acordo com o N4594 13.3.1.7 P1, na inicialização de lista
de cópia, o compilador é necessário para considerar um construtor explícito para resolução de sobrecarga. No
https://docs.microsoft.com/pt-br/cpp/error-messages/compiler-warnings/c4866
struct A
{
explicit A(int) {}
A(double) {}
};
int main()
{
A a1 = { 1 }; // error C3445: copy-list-initialization of 'A' cannot use an explicit constructor
const A& a2 = { 1 }; // error C2440: 'initializing': cannot convert from 'int' to 'const A &'
}
A a1{ 1 };
const A& a2{ 1 };
// From http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#1228
struct MyStore {
explicit MyStore(int initialCapacity);
};
struct MyInt {
MyInt(int i);
};
struct Printer {
void operator()(MyStore const& s);
void operator()(MyInt const& i);
};
void f() {
Printer p;
p({ 23 }); // C3066: there are multiple ways that an object of this type can be called with these
arguments
}
entanto, ele deve gerar um erro se essa sobrecarga específica for escolhida.
Os dois exemplos a seguir são compilados no Visual Studio 2015, mas não no Visual Studio 2017.
Para corrigir o erro, use a inicialização direta:
No Visual Studio 2015, o compilador incorretamente tratava a inicialização da lista de cópia da mesma maneira
que a inicialização de cópia regular : ela considerou apenas converter construtores para resolução de
sobrecarga. No exemplo a seguir, o Visual Studio 2015 escolhe MyInt(23) . O Visual Studio 2017 gera
corretamente o erro.
Esse exemplo é semelhante ao anterior, mas gera um erro diferente. Ele tem êxito no Visual Studio 2015 e falha
no Visual Studio 2017 com C2668.
struct A {
explicit A(int) {}
};
struct B {
B(int) {}
};
void f(const A&) {}
void f(const B&) {}
int main()
{
f({ 1 }); // error C2668: 'f': ambiguous call to overloaded function
}
Typedefs preteridosTypedefs preteridos
struct A
{
// also for __declspec(deprecated)
[[deprecated]] typedef int inttype;
};
int main()
{
A::inttype a = 0; // C4996 'A::inttype': was declared deprecated
}
constexpr
template<int N>
struct array
{
int size() const { return N; }
};
constexpr bool f(const array<1> &arr)
{
return arr.size() == 10 || arr.size() == 11; // C3615
}
Tipos de classe passados para funções variadicTipos de classe passados para funções variadic
O Visual Studio 2017 agora emite o aviso correto para TYPEDEFs preteridos declarados em uma classe ou
estrutura. O exemplo a seguir compila sem avisos no Visual Studio 2015. Ele produz C4996 no Visual Studio
2017.
O Visual Studio 2017 gera corretamente um erro quando o operando esquerdo de uma operação de avaliação
condicional não é válido em um contexto constexpr. O código a seguir é compilado no Visual Studio 2015, mas
não no Visual Studio 2017, onde ele gera C3615
constexpr function 'f' cannot result in a constant expression :
Para corrigir o erro, declare a array::size() função como constexpr ou remova o constexpr qualificador de
f .
No Visual Studio 2017, as classes ou structs que são passadas para uma função Variadic como printf devem
ser trivialmente copiáveis. Ao passar esses objetos, o compilador simplesmente faz uma cópia bit a bit e não
chama o construtor nem o destruidor.
#include <atomic>
#include <memory>
#include <stdio.h>
int main()
{
std::atomic<int> i(0);
printf("%i\n", i); // error C4839: non-standard use of class 'std::atomic<int>'
// as an argument to a variadic function.
// note: the constructor and destructor will not be called;
// a bitwise copy of the class will be passed as the argument
// error C2280: 'std::atomic<int>::atomic(const std::atomic<int> &)':
// attempting to reference a deleted function
struct S {
S(int i) : i(i) {}
S(const S& other) : i(other.i) {}
operator int() { return i; }
private:
int i;
} s(0);
printf("%i\n", s); // warning C4840 : non-portable use of class 'main::S'
// as an argument to a variadic function
}
std::atomic<int> i(0);
printf("%i\n", i.load());
struct S {/* as before */} s(0);
printf("%i\n", static_cast<int>(s))
CString str1;
CString str2 = _T("hello!");
str1.Format(_T("%s"), static_cast<LPCTSTR>(str2));
Qualificadores CV na construção de classeQualificadores CV na construção de classe
struct S
{
S(int);
operator int();
};
int i = (const S)0; // error C2440
Para corrigir o erro, é possível chamar uma função membro que retorna um tipo facilmente copiado,
ou usa uma conversão estática para converter o objeto antes de passá-lo:
Para cadeias de caracteres criadas e gerenciadas usando CString , o fornecido operator LPCTSTR() deve ser
usado para converter um CString objeto para o ponteiro C esperado pela cadeia de caracteres de formato.
No Visual Studio 2015, às vezes, o compilador ignora incorretamente o qualificador CV ao gerar um objeto de
classe por meio de uma chamada do construtor. Eventualmente, esse problema pode gerar uma falha ou
comportamento inesperado do runtime. O exemplo a seguir é compilado no Visual Studio 2015, mas gera um
erro de compilador no Visual Studio 2017:
Para corrigir o erro, declare operator int() como const .
Verificação de acesso em nomes qualificados em modelosVerificação de acesso em nomes qualificados em modelos
#include <type_traits>
template <class T> class S {
typedef typename T type;
};
template <class T, std::enable_if<std::is_integral<typename S<T>::type>::value, T> * = 0>
bool f(T x);
int main()
{
f(10); // C2672: No matching overloaded function found.
}
Listas de argumentos de modelo ausentesListas de argumentos de modelo ausentes
template <class T> class ListNode;
template <class T> using ListNodeMember = ListNode<T> T::*;
template <class T, ListNodeMember M> class ListHead; // C2955: 'ListNodeMember': use of alias
// template requires template argument list
// correct: template <class T, ListNodeMember<T> M> class ListHead;
Expressão SFINAEExpressão SFINAE
As versões anteriores do compilador não verificaram o acesso a nomes qualificados em alguns contextos de
modelo. Esse problema pode interferir no comportamento esperado do SFINAE, em que a substituição deve
falhardevido à inacessibilidade de um nome. Ele poderia ter causado potencialmente uma falha ou um
comportamento inesperado no tempo de execução, pois o compilador incorretamente chamou a sobrecarga
incorreta do operador. No Visual Studio 2017, é gerado um erro do compilador. O erro específico pode variar,
mas normalmente é C2672 no matching overloaded function found . O código a seguir é compilado no Visual
Studio 2015, mas gera um erro no Visual Studio 2017:
No Visual Studio 2015 e anterior, o compilador não diagnósticou todas as listas de argumentos de modelo
ausentes. Não notaria quando o modelo ausente apareceu em uma lista de parâmetros de modelo: por
exemplo, quando parte de um argumento de modelo padrão ou um parâmetro de modelo sem tipo estava
ausente. Esse problema pode resultar em comportamento imprevisível, incluindo falhas do compilador ou
comportamento inesperado do runtime. O código a seguir é compilado no Visual Studio 2015, mas produz um
erro no Visual Studio 2017.
Para dar suporte ao Expression-SFINAE, o compilador agora analisa decltype argumentos quando os modelos
são declarados em vez de instanciados. Consequentemente, se uma especialização não dependente for
encontrada no argumento decltype, ela não será adiada para a hora da instanciação. Ela será processada
imediatamente, e qualquer erro resultante será diagnosticado nesse momento.
O exemplo a seguir mostra esse erro do compilador gerado no momento da declaração:
#include <utility>
template <class T, class ReturnT, class... ArgsT>
class IsCallable
{
public:
struct BadType {};
template <class U>
static decltype(std::declval<T>()(std::declval<ArgsT>()...)) Test(int); //C2064. Should be declval<U>
template <class U>
static BadType Test(...);
static constexpr bool value = std::is_convertible<decltype(Test<T>(0)), ReturnT>::value;
};
constexpr bool test1 = IsCallable<int(), int>::value;
static_assert(test1, "PASS1");
constexpr bool test2 = !IsCallable<int*, int>::value;
static_assert(test2, "PASS2");
Classes declaradas em namespaces anônimosClasses declaradas em namespaces anônimos
struct __declspec(dllexport) S1 { virtual void f() {} }; //C2201
Inicializadores padrão para membros de classe de valor (C++/CLI)Inicializadores padrão para membros de classe de valor (C++/CLI)
value struct V
{
int i = 0; // error C3446: 'V::i': a default member initializer
// isn't allowed for a member of a value class
};
Indexadores padrão (C++/CLI)Indexadores padrão (C++/CLI)
De acordo com o padrão C++, uma classe declarada dentro de um namespace anônimo tem vinculação
interna, e isso significa que ela não pode ser exportada. No Visual Studio 2015 e anteriores, essa regra não era
aplicada. No Visual Studio 2017, a regra é parcialmente aplicada. No Visual Studio 2017, o exemplo a seguir
gera o erro C2201:
const anonymous namespace::S1::vftable: must have external linkage in order to be exported/imported.
No Visual Studio 2015 e nas versões anteriores, o compilador permitia (mas ignorava) um inicializador de
membro padrão para um membro de uma classe de valor. A inicialização padrão de uma classe de valor
sempre inicializa os membros em zero. Não é permitido um construtor padrão. No Visual Studio 2017, os
inicializadores de membro padrão geram um erro de compilador, conforme mostrado neste exemplo:
No Visual Studio 2015 e em versões anteriores, o compilador, em alguns casos, identificava incorretamente
uma propriedade padrão como um indexador padrão. Era possível contornar o problema usando o
identificador default para acessar a propriedade. A solução alternativa se tornou problemática após ter
default sido introduzida como uma palavra-chave em c++ 11. No Visual Studio 2017, os bugs que exigiam a
solução alternativa foram corrigidos. O compilador agora gera um erro quando default é usado para acessar
a propriedade padrão para uma classe.
//class1.cs
using System.Reflection;
using System.Runtime.InteropServices;
namespace ClassLibrary1
{
[DefaultMember("Value")]
public class Class1
{
public int Value
{
// using attribute on the return type triggers the compiler bug
[return: MarshalAs(UnmanagedType.I4)]
get;
}
}
[DefaultMember("Value")]
public class Class2
{
public int Value
{
get;
}
}
}
// code.cpp
#using "class1.dll"
void f(ClassLibrary1::Class1 ^r1, ClassLibrary1::Class2 ^r2)
{
r1->Value; // error
r1->default;
r2->Value;
r2->default; // error
}
#using "class1.dll"
void f(ClassLibrary1::Class1 ^r1, ClassLibrary1::Class2 ^r2)
{
r1->Value;
r2->Value;
}
Correções de bugs no 15,3
Chamadas para modelos de membros excluídosChamadas para modelos de membros excluídos
No Visual Studio de 2017, é possível acessar ambas as propriedades Value pelo nome:
Nas versões anteriores do Visual Studio, o compilador em alguns casos não emitiria um erro para chamadas
malformadas para um modelo de membro excluído. Essas chamadas poderiam causar falhas em tempo de
execução. O código a seguir agora produz C2280,
'int S<int>::f<int>(void)': attempting to reference a deleted function :
template<typename T>
struct S {
template<typename U> static int f() = delete;
};
void g()
{
decltype(S<int>::f<int>()) i; // this should fail
}
Verificações de pré-condição para características de tipoVerificações de pré-condição para características de tipo
struct S;
enum E;
static_assert(!__is_assignable(S, S), "fail"); // C2139 in 15.3
static_assert(__is_convertible_to(E, E), "fail"); // C2139 in 15.3
Novas verificações de runtime e o aviso do compilador em marshaling nativo para gerenciadoNovas verificações de runtime e o aviso do compilador em marshaling nativo para gerenciado
Para corrigir o erro, declare i como int .
O Visual Studio 2017 versão 15.3 melhora as verificações de pré-condição para características de tipo para
seguir o padrão mais estritamente. Uma verificação assim destina-se aos atribuíveis. O código a seguir produz
C2139 no Visual Studio 2017 versão 15.3:
Chamar desde funções gerenciadas a funções nativas requer o marshaling. O CLR faz marshaling, mas não
entende a semântica do C++. Se você passar um objeto nativo por valor, o CLR chamará o construtor de cópia
do objeto ou usará BitBlt , o que poderá causar um comportamento indefinido em runtime.
Agora, o compilador emite um aviso se encontrar esse erro no momento da compilação: um objeto nativo com
o construtor de cópia excluído é passado entre um limite nativo e o gerenciado por valor. Nos casos em que o
compilador não souber no tempo de compilação, ele injetará uma verificação de runtime para que o programa
chame std::terminate imediatamente quando um marshaling malformado ocorrer. No Visual Studio 2017
versão 15,3, o código a seguir produz o aviso C4606
'A': passing argument by value across native and managed boundary requires valid copy constructor.
Otherwise, the runtime behavior is undefined.
class A
{
public:
A() : p_(new int) {}
~A() { delete p_; }
A(A const &) = delete;
A(A &&rhs) {
p_ = rhs.p_;
}
private:
int *p_;
};
#pragma unmanaged
void f(A a)
{
}
#pragma managed
int main()
{
f(A()); // This call from managed to native requires marshaling. The CLR doesn't understand C++ and
uses BitBlt, which results in a double-free later.
}
Aviso de API experimental para WinRTAviso de API experimental para WinRT
Windows::Storage::IApplicationDataStatics2::GetForUserAsync(); //C4698
#pragma warning(push)
#pragma warning(disable:4698)
Windows::Storage::IApplicationDataStatics2::GetForUserAsync();
#pragma warning(pop)
Definição fora da linha de uma função de membro de modeloDefinição fora da linha de uma função de membro de modelo
Para corrigir o erro, remova a diretiva #pragma managed para marcar o chamador como nativo e evitar
marshaling.
As APIs do WinRT lançadas para experimentaçãoe comentários são decoradas com
Windows.Foundation.Metadata.ExperimentalAttribute . No Visual Studio 2017 versão 15,3, o compilador produz o
aviso C4698 para este atributo. Algumas APIs em versões anteriores do SDK do Windows já tinham sido
decoradas com o atributo, e chamadas para essas APIs agora começam a disparar esse aviso do compilador.
SDKs mais recentes do Windows têm o atributo removido de todos os tipos enviados. Se estiver usando um
SDK mais antigo, você precisará suprimir esses avisos para todas as chamadas para os tipos enviados.
O código a seguir produz o aviso C4698:
'Windows::Storage::IApplicationDataStatics2::GetForUserAsync' is for evaluation purposes only and is subject
to change or removal in future updates
:
Para desabilitar o aviso, adicione um #pragma:
O Visual Studio 2017 versão 15,3 produz um erro para uma definição fora de linha de uma função de membro
de modelo que não foi declarada na classe. O código a seguir agora produz o erro C2039:
struct S {};
template <typename T>
void S::f(T t) {} //C2039: 'f': is not a member of 'S'
struct S {
template <typename T>
void f(T t);
};
template <typename T>
void S::f(T t) {}
Tentar obter o endereço do ponteiro Tentar obter o endereço do ponteiro this
Conversão em uma classe base inacessívelConversão em uma classe base inacessível
#include <memory>
class B { };
class D : B { }; // C2243. should be public B { };
void f()
{
std::unique_ptr<B>(new D());
}
Os argumentos padrão não são permitidos em definições fora de linha de funções de membroOs argumentos padrão não são permitidos em definições fora de linha de funções de membro
template <typename T>
struct A {
T f(T t, bool b = false);
};
template <typename T>
T A<T>::f(T t, bool b = false) // C5034
{
// ...
}
'f': is not a member of 'S' :
Para corrigir o erro, adicione uma declaração à classe:
Em C++, this é um não prvalue do tipo ponteiro para X. Você não pode pegar o endereço this ou associá-lo
a uma referência lvalue. Nas versões anteriores do Visual Studio, o compilador permitia contornar essa
restrição com o uso de uma conversão. No Visual Studio 2017 versão 15.3, o compilador produz o erro C2664.
O Visual Studio 2017 versão 15.3 gera um erro quando você tenta converter um tipo em uma classe base que
está inacessível. O compilador agora gera o erro C2243:
'type cast': conversion from 'D *' to 'B *' exists, but is inaccessible . O código a seguir está malformado
e poderá causar uma falha em runtime. O compilador agora produz C2243 quando vê um código como este:
Os argumentos padrão não são permitidos em definições fora da linha de funções de membro em classes de
modelo. O compilador emitirá um aviso em /permissive e um erro de hardware em /permissive- .
Nas versões anteriores do Visual Studio, o código malformado a seguir pode causar uma falha de runtime. O
Visual Studio 2017 versão 15,3 produz o aviso C5034:
'A\<T>::f': an out-of-line definition of a member of a class template cannot have default arguments :
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
Uso de Uso de offsetof com o designador de membro composto com o designador de membro composto
struct A {
int arr[10];
};
// warning C4841: non-standard extension used: compound member designator in offsetof
constexpr auto off = offsetof(A, arr[2]);
#pragma warning(push)
#pragma warning(disable: 4841)
constexpr auto off = offsetof(A, arr[2]);
#pragma warning(pop)
Uso de Uso de offsetof com o membro de dados estáticos ou função de membro com o membro de dados estáticos ou função de membro
#include <cstddef>
struct A {
int ten() { return 10; }
static constexpr int two = 2;
};
constexpr auto off = offsetof(A, ten);
constexpr auto off2 = offsetof(A, two);
Novo aviso em atributos Novo aviso em atributos __declspec
__declspec(noinline) extern "C" HRESULT __stdcall //C4768
Para corrigir o erro, remova o argumento padrão = false .
No Visual Studio 2017 versão 15,3, usar offsetof(T, m) onde m é um "designador de membro composto"
resulta em um aviso quando você compila com a /Wall opção. O código a seguir está malformado e pode
causar falhas em runtime. O Visual Studio 2017 versão 15,3 produz o aviso C4841:
non-standard extension used: compound member designator in offsetof :
Para corrigir o código, desabilite o aviso com um pragma ou altere o código para não usar offsetof :
No Visual Studio 2017 versão 15.3, usar offsetof(T, m) , em que m se refere a um membro de dados estático
ou uma função de membro, resultará em um erro. O código a seguir produz o erro C4597:
undefined behavior: offsetof applied to member function 'example' e o erro C4597:
undefined behavior: offsetof applied to static data member 'sample' :
Esse código está malformado e pode causar falhas em runtime. Para corrigir o erro, altere o código para não
invocar mais um comportamento indefinido. Esse é o código não portátil que não é permitido pelo padrão
C++.
No Visual Studio 2017 versão 15.3, o compilador não ignora os atributos se __declspec(...) é aplicado antes
da especificação de vinculação extern "C" . Anteriormente, o compilador ignorava o atributo, o que podia ter
implicações de runtime. Quando as /Wall /WX Opções e são definidas, o código a seguir produz o aviso
C4768: __declspec attributes before linkage specification are ignored :
Para corrigir o aviso, coloque extern "C" primeiro:
extern "C" __declspec(noinline) HRESULT __stdcall
decltype e chamadas para destruidores excluídos e chamadas para destruidores excluídos
template<typename T>
struct A
{
~A() = delete;
};
template<typename T>
auto f() -> A<T>;
template<typename T>
auto g(T) -> decltype((f<T>()));
void h()
{
g(42);
}
Variáveis constantes não inicializadasVariáveis constantes não inicializadas
const int Value; //C4132
Declarações vaziasDeclarações vazias
struct A {};
template <typename> struct B {};
enum C { c1, c2, c3 };
int; // warning C4091 : '' : ignored on left of 'int' when no variable is declared
A; // warning C4091 : '' : ignored on left of 'main::A' when no variable is declared
B<int>; // warning C4091 : '' : ignored on left of 'B<int>' when no variable is declared
C; // warning C4091 : '' : ignored on left of 'C' when no variable is declared
std::is_convertible para tipos de matriz para tipos de matriz
Esse aviso está desativado por padrão em 15,3, mas ativado por padrão em 15,5 e só afeta o código compilado
com /Wall /WX .
Nas versões anteriores do Visual Studio, o compilador não detectou quando uma chamada a um destruidor
excluído ocorreu no contexto da expressão associada a decltype . No Visual Studio 2017 versão 15,3, o código
a seguir produz o erro C2280: 'A<T>::~A(void)': attempting to reference a deleted function :
A versão do Visual Studio 2017 RTW teve uma regressão: o compilador C++ não emitiu um diagnóstico para
uma variável não inicializada const . Essa regressão foi corrigida no Visual Studio 2017 versão 15.3. O código
a seguir agora produz o aviso C4132: 'Value': const object should be initialized :
Para corrigir o erro, atribua um valor a Value .
O Visual Studio 2017 versão 15.3 agora avisa sobre declarações vazias para todos os tipos, não apenas tipos
internos. Agora, o código a seguir produz um aviso C4091 de nível 2 para todas as quatro declarações:
Para remover os avisos, comente ou remova as declarações vazias. Em casos em que o objeto não nomeado se
destinar a ter um efeito colateral (como RAII), ele deverá receber um nome.
O aviso é excluído em /Wv:18 e está ativado por padrão no nível de aviso W2.
#include <type_traits>
using Array = char[1];
static_assert(std::is_convertible<Array, Array>::value);
static_assert(std::is_convertible<const Array, const Array>::value, "");
static_assert(std::is_convertible<Array&, Array>::value, "");
static_assert(std::is_convertible<Array, Array&>::value, "");
To test() { return std::declval<From>(); }
Destruidoresprivados e Destruidores privados e std::is_constructible
#include <type_traits>
class PrivateDtor {
PrivateDtor(int) { }
private:
~PrivateDtor() { }
};
// This assertion used to succeed. It now correctly fails.
static_assert(std::is_constructible<PrivateDtor, int>::value);
T obj(std::declval<Args>()...)
C2668: resolução de sobrecarga ambíguaC2668: resolução de sobrecarga ambígua
As versões anteriores do compilador forneciam resultados incorretos para std::is_convertible para tipos de
matriz. Isso exigia que gravadores de biblioteca tratassem o compilador do Microsoft C++ de forma especial ao
usar a característica de tipo std::is_convertible<...> . No exemplo a seguir, as declarações de estática passam
em versões anteriores do Visual Studio, mas falham no Visual Studio 2017 versão 15.3:
std::is_convertible<From, To> é calculada para verificar se uma definição de função imaginária está bem
formada:
As versões anteriores do compilador ignoravam se um destruidor era particular quando decidia o resultado de
std::is_constructible. Agora ele os considera. No exemplo a seguir, as declarações de estática passam em versões
anteriores do Visual Studio, mas falham no Visual Studio 2017 versão 15.3:
Os destruidores particulares fazem com que um tipo não seja construível. std::is_constructible<T, Args...> é
calculada como se a declaração a seguir estivesse escrita:
Essa chamada implica em uma chamada de destruidor.
As versões anteriores do compilador falhavam algumas vezes ao detectar ambiguidade quando encontravam
vários candidatos, tanto por meio de declarações using quanto de pesquisas dependentes de argumento. Essa
falha pode levar à escolha errada de sobrecarga e ao comportamento inesperado de runtime. No exemplo a
seguir, o Visual Studio 2017 versão 15,3 gera C2668 corretamente 'f': ambiguous call to overloaded function
:
https://docs.microsoft.com/pt-br/cpp/standard-library/is-convertible-class
https://docs.microsoft.com/pt-br/cpp/standard-library/is-constructible-class
namespace N {
template<class T>
void f(T&, T&);
template<class T>
void f();
}
template<class T>
void f(T&, T&);
struct S {};
void f()
{
using N::f;
S s1, s2;
f(s1, s2); // C2668
}
C2660: declarações de função locais e pesquisa dependente de argumentoC2660: declarações de função locais e pesquisa dependente de argumento
struct S {};
void f(S, int);
void g()
{
void f(S); // C2660 'f': function does not take 2 arguments:
// or void f(S, int);
S s;
f(s, 0);
}
C5038: ordem de inicialização em listas de inicializadorC5038: ordem de inicialização em listas de inicializador
struct A
{
A(int a) : y(a), x(y) {} // Initialized in reverse, y reused
int x;
int y;
};
Para corrigir o código, remova o uso da instrução N::f se você pretende chamar ::f() .
As declarações de função local ocultam a declaração de função no escopo delimitador e desabilitam a pesquisa
dependente de argumento. No entanto, as versões anteriores do compilador sempre fizeram a pesquisa
dependente de argumento nesse caso. Ele poderia potencialmente levar à sobrecarga incorreta sendo escolhida
e ao comportamento de tempo de execução inesperado. Normalmente, o erro é devido a uma assinatura
incorreta da declaração da função local. No exemplo a seguir, o Visual Studio 2017 versão 15,3 gera C2660
corretamente 'f': function does not take two arguments :
Para corrigir o problema, altere a assinatura f(S) ou remova-a.
Membros de classe são inicializados na ordem em que são declarados, não na ordem em que aparecem nas
listas de inicializadores. As versões anteriores do compilador não avisavam quando a ordem da lista de
inicializadores era diferente da ordem da declaração. Esse problema pode levar a um comportamento
indefinido em tempo de execução se a inicialização de um membro depender de outro membro da lista já estar
sendo inicializada. No exemplo a seguir, o Visual Studio 2017 versão 15,3 (with /Wall ) gera o aviso C5038:
data member 'A::y' will be initialized after data member 'A::x' :
Correções de bugs e outras alterações de comportamento no 15,5
Alteração de ordenação parcialAlteração de ordenação parcial
template<typename... T>
int f(T* ...)
{
return 1;
}
template<typename T>
int f(const T&)
{
return 2;
}
int main()
{
int i = 0;
f(&i); // C2668
}
t161.cpp
t161.cpp(16): error C2668: 'f': ambiguous call to overloaded function
t161.cpp(8): note: could be 'int f<int*>(const T &)'
with
[
T=int*
]
t161.cpp(2): note: or 'int f<int>(int*)'
t161.cpp(16): note: while trying to match the argument list '(int*)'
template<typename... T>
int f(T* ...)
{
return 1;
}
template<typename T>
int f(T&)
{
return 2;
}
int main()
{
int i = 0;
f(&i);
}
Para corrigir o problema, organize a lista do inicializador para que tenha a mesma ordem que as declarações.
Um aviso semelhante é gerado quando um ou ambos os inicializadores fazem referência a membros de classe
base.
Esse aviso está fora do padrão e afeta apenas o código compilado com /Wall .
O compilador agora rejeita corretamente o código a seguir e oferece a mensagem de erro correta:
O problema no exemplo acima é que há duas diferenças nos tipos (const versus não const e pacote versus não
pack). Para eliminar o erro do compilador, remova uma das diferenças. Em seguida, o compilador pode ordenar
de forma não ambígua as funções.
Manipuladores de exceçãoManipuladores de exceção
int main()
{
try {
throw "";
}
catch (int (&)[1]) {} // C4843 (This should always be dead code.)
catch (void (&)()) {} // C4843 (This should always be dead code.)
catch (char*) {} // This should not be a match under /Zc:strictStrings
}
warning C4843: 'int (&)[1]': An exception handler of reference to array or function type is unreachable,
use 'int*' instead
warning C4843: 'void (__cdecl &)(void)': An exception handler of reference to array or function type is
unreachable, use 'void (__cdecl*)(void)' instead
catch (int (*)[1]) {}
O namespace O namespace std::tr1 é preterido é preterido
#include <functional>
#include <iostream>
using namespace std;
int main() {
std::tr1::function<int (int, int)> f = std::plus<int>(); //C4996
cout << f(3, 5) << std::endl;
f = std::multiplies<int>();
cout << f(3, 5) << std::endl;
}
warning C4996: 'std::tr1': warning STL4002: The non-standard std::tr1 namespace and TR1-only machinery are
deprecated and will be REMOVED. You can define _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING to acknowledge
that you have received this warning.
Manipuladores de referência para o tipo de matriz ou função nunca são uma correspondência para qualquer
objeto de exceção. O compilador agora segue corretamente essa regra e aciona um aviso de nível 4. Ele
também não corresponde mais a um manipulador de char* ou wchar_t* a uma cadeia de caracteres literal
quando /Zc:strictStrings é usado.
O código a seguir evita o erro:
O namespace não padrão std::tr1 está marcado como preterido nos modos C++14 e C++17. No Visual
Studio 2017 versão 15.5, o código a seguir aciona C4996:
Para corrigir o erro, remova a referência ao namespace tr1 :
#include <functional>
#include <iostream>
using namespace std;
int main() {
std::function<int (int, int)> f = std::plus<int>();
cout << f(3, 5) << std::endl;
f = std::multiplies<int>();
cout << f(3, 5) << std::endl;
}
Os recursos de biblioteca padrão no anexo D são marcados como preteridosOs recursos de biblioteca padrão no anexo D são marcados como preteridos
#include <iterator>
class MyIter : public std::iterator<std::random_access_iterator_tag, int> {
public:
// ... other members ...
};
#include <type_traits>
static_assert(std::is_same<MyIter::pointer, int*>::value, "BOOM");
warning C4996: 'std::iterator<std::random_access_iterator_tag,int,ptrdiff_t,_Ty*,_Ty &>::pointer': warning
STL4015: The std::iterator class template (used as a base classto provide typedefs) is deprecated in
C++17. (The <iterator> header is NOT deprecated.) The C++ standard has never required user-defined
iterators to derive from std::iterator. To fix this warning, stop deriving from std::iterator and start
providing publicly accessible typedefs named iterator_category, value_type, difference_type, pointer, and
reference. Note that value_type is required to be non-const, even for constant iterators. You can define
_SILENCE_CXX17_ITERATOR_BASE_CLASS_DEPRECATION_WARNING or _SILENCE_ALL_CXX17_DEPRECATION_WARNINGS to
acknowledge that you have received this warning.
#include <iterator>
class MyIter {
public:
typedef std::random_access_iterator_tag iterator_category;
typedef int value_type;
typedef ptrdiff_t difference_type;
typedef int* pointer;
typedef int& reference;
// ... other members ...
};
#include <type_traits>
static_assert(std::is_same<MyIter::pointer, int*>::value, "BOOM");
Variáveis locais não referenciadasVariáveis locais não referenciadas
Quando a /std:c++17 opção de compilador de modo é definida, quase todos os recursos de biblioteca padrão
no anexo D são marcados como preteridos.
No Visual Studio 2017 versão 15.5, o código a seguir aciona C4996:
Para corrigir o erro, siga as instruções no texto de aviso, conforme demonstrado no código a seguir :
No Visual Studio 15.5, o aviso C4189 é emitido em mais casos, conforme mostrado no código a seguir :
void f() {
char s[2] = {0}; // C4189. Either use the variable or remove it.
}
warning C4189: 's': local variable is initialized but not referenced
Comentários de única linhaComentários de única linha
/* C only */
#pragma warning(disable:4001) //C4619
#pragma warning(disable:4179)
// single line comment
//* single line comment */
warning C4619: #pragma warning: there is no warning number '4001'
/* C only */
#pragma warning(disable:4619)
#pragma warning(disable:4001)
#pragma warning(disable:4179)
// single line comment
/* single line comment */
Atributos Atributos __declspec com vinculação com vinculação extern "C"
__declspec(noinline) extern "C" HRESULT __stdcall //C4768
warning C4768: __declspec attributes before linkage specification are ignored
extern "C" __declspec(noinline) HRESULT __stdcall
Para corrigir o erro, remova a variável não usada.
No Visual Studio 2017 versão 15.5, os avisos C4001 e C4179 não são emitidos pelo compilador C.
Anteriormente, eles eram emitidos apenas sob a /Za opção do compilador. Os avisos não são mais necessários
porque comentários de linha única fazem parte do padrão C desde C99.
Quando o código não precisa ser compatível com versões anteriores, você pode evitar o aviso removendo a
supressão de C4001/C4179. Se o código precisar ser compatível com versões anteriores, suprima somente
C4619.
Em versões anteriores do Visual Studio, o compilador ignorou atributos __declspec(...) quando
__declspec(...) foi aplicado antes da especificação de vinculação extern "C" . Esse comportamento faz com
que seja gerado código não pretendido pelo usuário, com possíveis consequências no runtime. O aviso foi
adicionado no Visual Studio versão 15.3, mas era desativado por padrão. No Visual Studio 2017 versão 15.5, o
aviso está habilitado por padrão.
Para corrigir o erro, coloque a especificação de vinculação antes do atributo __declspec:
#pragma warning (push)
#pragma warning(disable:4768)
#include <shlobj.h>
#pragma warning (pop)
extern constexpr vinculaçãovinculação
extern constexpr int x = 10;
error LNK2005: "int const x" already defined
extern constexpr __declspec(selectany) int x = 10;
typeid não pode ser usado em tipo de classe incompleto não pode ser usado em tipo de classe incompleto
#include <typeinfo>
struct S;
void f() { typeid(S); } //C2027 in 15.5
error C2027: use of undefined type 'S'
Tipo de destino de Tipo de destino de std::is_convertible
Esse novo aviso C4768 é determinado em alguns cabeçalhos do SDK do Windows que foram fornecidos com o
Visual Studio 2017 15.3 ou anterior (por exemplo: versão 10.0.15063.0, também conhecido como SDK do RS2).
No entanto, as versões posteriores dos cabeçalhos do SDK do Windows (especificamente, ShlObj.h e
ShlObj_core.h) foram corrigidas para que não produzam o aviso. Quando você vir esse aviso proveniente de
cabeçalhos do SDK do Windows, poderá executar estas ações:
1. Mude para o SDK do Windows mais recente que acompanha o Visual Studio 2017 versão 15.5.
2. Desligue o aviso ao redor de #include da instrução de cabeçalho do SDK do Windows:
Em versões anteriores do Visual Studio, o compilador sempre deu uma constexpr variável de vinculação
interna mesmo quando a variável foi marcada extern . No Visual Studio 2017 versão 15,5, uma nova opção de
compilador ( /Zc:externConstexpr ) habilita o comportamento correto de conformidade com padrões. No fim
das contas, esse comportamento se tornará o padrão.
Se um arquivo de cabeçalho contiver uma variável declarada extern constexpr , ele precisará ser marcado
__declspec(selectany) para ter suas declarações duplicadas combinadas corretamente:
Em versões anteriores do Visual Studio, o compilador permitia incorretamente o código a seguir, resultando em
informações de tipo potencialmente incorretas. No Visual Studio 2017 versão 15.5, o compilador produz
corretamente um erro:
std::is_convertible requer que o tipo de destino seja um tipo de retorno válido. Em versões anteriores do
Visual Studio, o compilador permitia incorretamente tipos abstratos, que podem levar à resolução de
sobrecarga incorreta e ao comportamento de runtime imprevisto. O código a seguir agora aciona C2338
corretamente:
#include <type_traits>
struct B { virtual ~B() = 0; };
struct D : public B { virtual ~D(); };
static_assert(std::is_convertible<D, B>::value, "fail"); // C2338 in 15.5
#include <type_traits>
struct B { virtual ~B() = 0; };
struct D : public B { virtual ~D(); };
static_assert(std::is_convertible<D *, B *>::value, "fail");
Remoção de especificação de exceção dinâmica e Remoção de especificação de exceção dinâmica e noexcept
void f() throw(); // equivalent to void f() noexcept;
void f() {} // warning C5043
void g() throw(); // warning C5040
struct A {
virtual void f() throw();
};
struct B : A {
virtual void f() { } // error C2694
};
void f() noexcept;
void f() noexcept { }
void g() noexcept(false);
struct A {
virtual void f() noexcept;
};
struct B : A {
virtual void f() noexcept { }
};
Para evitar o erro, você deve comparar tipos de ponteiro ao usar is_convertible , pois uma comparação de tipo
que não é de ponteiro poderá falhar se um tipo for abstrato:
No C++ 17, throw() é um alias para noexcept , throw(<type list>) e throw(...) é removido, e
determinados tipos podem incluir noexcept . Essa mudança pode causar problemas de compatibilidade de
origem com o código que está em conformidade com a C++14 ou anterior. A /Zc:noexceptTypes- opção pode
ser usada para reverter para a versão c++ 14 do noexcept ao usar o modo c++ 17 em geral. Ela permite
atualizar seu código-fonte para estar em conformidade com a C++17 sem precisar reescrever todo o código
throw() ao mesmo tempo.
O compilador agora também diagnostica mais especificações de exceção incompatíveis em declarações no
modo C++ 17 ou com /permissive- o novo aviso C5043.
O código a seguir gera C5043 e C5040 no Visual Studio 2017 versão 15,5 quando a /std:c++17 opção é
aplicada:
Para remover os erros enquanto estiver usando o /std:c++17 , adicione a /Zc:noexceptTypes- opção à linha de
comando ou atualize seu código para usar noexcept , conforme mostrado no exemplo a seguir :
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
Variáveis embutidasVariáveis embutidas
struct X {
static constexpr int size = 3;
};
const int X::size; // C5041
O aviso C4768 de O aviso C4768 de extern "C" __declspec(...) agora está ativado por padrão agora está ativadopor padrão
Funções usadas como padrão e Funções usadas como padrão e __declspec(nothrow)
struct A {
A& operator=(const A& other) { // No exception specification; this function may throw.
...
}
};
struct B : public A {
__declspec(nothrow) B& operator=(const B& other) = default;
};
int main()
{
B b1, b2;
b2 = b1; // error C2280
}
constexpr Os membros de dados estáticos agora são implicitamente inline , o que significa que sua
declaração dentro de uma classe agora é sua definição. O uso de uma definição fora de linha para um
static constexpr membro de dados é redundante e agora é preterido. No Visual Studio 2017 versão 15,5,
quando a /std:c++17 opção é aplicada, o seguinte código agora produz o aviso C5041
'size': out-of-line definition for constexpr static data member is not needed and is deprecated in C++17 :
O aviso foi adicionado no Visual Studio versão 2017 versão 15.3, mas estava desativado por padrão. No Visual
Studio 2017 versão 15.5, o aviso está ativo por padrão. Para obter mais informações, consulte novo aviso em _
_ atributos declspec.
O compilador permitia anteriormente que funções padronizadas fossem declaradas com __declspec(nothrow)
quando as funções de base/membro correspondente permitiam exceções. Esse comportamento é contrário ao
padrão C++ e pode causar um comportamento indefinido no runtime. O padrão exige que tais funções sejam
definidas como excluídas se houver uma incompatibilidade de especificação de exceção. Em /std:c++17 , o
código a seguir gera C2280
attempting to reference a deleted function. Function was implicitly deleted because the explicit exception
specification is incompatible with that of the implicit declaration.
Para corrigir esse código, remova o __declspec(nothrow) da função padronizada ou o = default e forneça uma
definição para a função juntamente com qualquer manipulação de exceção necessária:
struct A {
A& operator=(const A& other) {
// ...
}
};
struct B : public A {
B& operator=(const B& other) = default;
};
int main()
{
B b1, b2;
b2 = b1;
}
Especializações parciais e Especializações parciais e noexcept
template <typename T> struct A;
template <>
struct A<void(*)()>
{
static const bool value = true;
};
template <typename T>
bool g(T t)
{
return A<T>::value;
}
void f() noexcept {}
int main()
{
return g(&f) ? 0 : 1; // C2027
}
Com noexcept no sistema de tipos, as especializações parciais para correspondência de tipos "chamáveis"
específicos podem não compilar ou não escolher o modelo primário, devido à ausência de uma especialização
parcial para ponteiros para as funções Except.
Nesses casos, talvez seja necessário adicionar mais especialidades parciais para lidar com ponteiros de
noexcept função e noexcept ponteiros para funções de membro. Essas sobrecargas são apenas no
/std:c++17 modo legal. Se for necessário manter a compatibilidade com versões anteriores de C++14 e você
estiver escrevendo código que outras pessoas consumirão, será necessário proteger essas novas sobrecargas
dentro de diretivas #ifdef . Se você estiver trabalhando em um módulo independente, em vez de usar #ifdef
as proteções, basta compilar com a /Zc:noexceptTypes- opção.
O código a seguir é compilado em /std:c++14 , mas falha em /std:c++17 com
error C2027: use of undefined type 'A<T>' :
O código a seguir é executado com sucesso /std:c++17 porque o compilador escolhe a nova especialização
parcial A<void (*)() noexcept> :
template <typename T> struct A;
template <>
struct A<void(*)()>
{
static const bool value = true;
};
template <>
struct A<void(*)() noexcept>
{
static const bool value = true;
};
template <typename T>
bool g(T t)
{
return A<T>::value;
}
void f() noexcept {}
int main()
{
return g(&f) ? 0 : 1; // OK
}
Correções de bugs e outras alterações de comportamento no 15,7
C++ 17: argumento padrão no modelo de classe primáriaC++ 17: argumento padrão no modelo de classe primária
template<typename T>
struct S {
void f(int = 0);
};
template<typename T>
void S<T>::f(int = 0) {} // Re-definition necessary
template<typename T>
struct S {
void f(int = 0);
};
template<typename T>
void S<T>::f(int) {} // Default argument is used
Resolução de nome dependenteResolução de nome dependente
Essa alteração de comportamento é uma pré-condição para Dedução de argumento de modelo para modelos
de classe – P0091R3.
Anteriormente, o compilador ignorava o argumento padrão no modelo de classe primária:
No /std:c++17 modo no Visual Studio 2017 versão 15,7, o argumento padrão não é ignorado:
Essa alteração de comportamento é uma pré-condição para Dedução de argumento de modelo para modelos
de classe – P0091R3.
No exemplo a seguir, o compilador do Visual Studio 15.6 e anterior resolve D::type como B<T>::type no
modelo de classe primária.
https://wg21.link/p0091r3
https://wg21.link/p0091r3
template<typename T>
struct B {
using type = T;
};
template<typename T>
struct D : B<T*> {
using type = B<T*>::type;
};
template<typename T>
struct B {
using type = T;
};
template<typename T>
struct D : B<T*> {
using type = typename B<T*>::type;
};
C++17: Atributo C++17: Atributo [[nodiscard]] – aumento do nível de aviso – aumento do nível de aviso
[[nodiscard]] int f() { return 0; }
int main() {
f(); // warning: discarding return value
// of function with 'nodiscard'
}
Lista de inicialização de classe base do construtor de modelo VariadicLista de inicialização de classe base do construtor de modelo Variadic
template<typename T>
struct B {};
template<typename T>
struct D : B<T>
{
template<typename ...C>
D() : B() {} // C2614. Missing template arguments to B.
};
D<int> d;
O Visual Studio 2017 versão 15,7, no /std:c++17 modo, requer a typename palavra-chave na using instrução
em D. Sem typename , o compilador gera o aviso C4346: 'B<T*>::type': dependent name is not a type e o erro
C2061: syntax error: identifier 'type' :
No Visual Studio 2017 versão 15,7 no /std:c++17 modo, o nível de aviso de C4834
discarding return value of function with 'nodiscard' attribute é aumentado de W3 para W1. Você pode
desabilitar o aviso com uma conversão para void ou passando /wd:4834 para o compilador
Em edições anteriores do Visual Studio, uma lista de inicialização de classe base do construtor de modelo
variadic que não continha argumentos de modelos foi erroneamente permitida sem erro. No Visual Studio
2017 versão 15.7 é gerado um erro do compilador.
O exemplo de código a seguir no Visual Studio 2017 versão 15,7 gera o erro C2614:
D<int>: illegal member initialization: 'B' is not a base or member .
Inicialização de agregação de Inicialização de agregação de constexpr
#include <array>
struct X {
unsigned short a;
unsigned char b;
};
int main() {
constexpr std::array<X, 2> xs = {
{ 1, 2 },
{ 3, 4 }
};
return 0;
}
#include <array>
struct X {
unsigned short a;
unsigned char b;
};
int main() {
constexpr std::array<X, 2> xs = {{ // note double braces
{ 1, 2 },
{ 3, 4 }
}}; // note double braces
return 0;
}
Correções de bugs e alterações de comportamento em 15,8
typename em identificadores não qualificados em identificadores não qualificados
template <typename T>
using X = typename T;
__declspec() no lado direito das definições de modelo de alias no lado direito das definições de modelo de alias
Para corrigir o erro, altere a expressão B () para B <T> ().
As versões anteriores do compilador C++ manipulavam incorretamente a constexpr inicialização de
agregação. O compilador aceitou o código inválido no qual o Aggregate-init-List tinha muitos elementos e
produziu CodeGen incorreto para ele. O código a seguir é um exemplo desse código:
No Visual Studio 2017 versão 15,7 atualização 3 e posterior, o exemplo anterior agora gera C2078
too many initializers . O exemplo a seguir mostra como corrigir ocódigo. Ao inicializar um std::array com
chaves init-lists aninhadas, forneça para matriz interna uma lista entre chaves própria:
As alterações do compilador no Visual Studio 2017 versão 15,8 são todas as correções de bugs e alterações de
comportamento. Eles estão listados abaixo:
No /permissive- modo, typename palavras-chave falsas em identificadores não qualificados em definições de
modelo de alias não são mais aceitas pelo compilador. O código a seguir agora produz C7511
'T': 'typename' keyword must be followed by a qualified name :
Para corrigir o erro, altere a segunda linha para using X = T; .
__declspec não é mais permitido no lado direito de uma definição de modelo de alias. Anteriormente, o
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://docs.microsoft.com/pt-br/cpp/cpp/declspec
template <typename T>
using X = __declspec(deprecated("msg")) T;
template <typename T>
using X [[deprecated("msg")]] = T;
Diagnóstico de pesquisa de nome em duas fasesDiagnóstico de pesquisa de nome em duas fases
template <class T>
struct Base {
int base_value = 42;
};
template <class T>
struct S : Base<T> {
int f() {
return base_value;
}
};
Declarações e definições de encaminhamento no namespace Declarações e definições de encaminhamento no namespace std
compilador aceitou, mas ignorei esse código. Ele nunca resultaria em um aviso de reprovação quando o alias
foi usado.
O atributo C++ padrão [ [ ] ] preterido pode ser usado em vez disso e é respeitado no Visual Studio 2017
versão 15,6. O código a seguir agora produz C2760
syntax error: unexpected token '__declspec', expected 'type specifier' :
Para corrigir o erro, altere o código da seguinte forma (com o atributo colocado antes de '=' da definição do
alias):
A pesquisa de nome em duas fases requer que os nomes não dependentes usados nos corpos do modelo
fiquem visíveis para o modelo no tempo de definição. Anteriormente, o compilador C++ da Microsoft deixaria
um nome não encontrado como não pesquisado até o momento da instanciação. Agora, ele exige que os
nomes não dependentes estejam vinculados no corpo do modelo.
Uma forma em que isso se manifesta é com a pesquisa em classes base dependentes. Anteriormente, o
compilador permitia o uso de nomes que são definidos em classes base dependentes. Isso ocorre porque eles
seriam pesquisados durante o tempo de instanciação quando todos os tipos são resolvidos. Agora, esse código
é tratado como um erro. Nesses casos, você pode forçar a pesquisa da variável no tempo de instanciação
qualificando-a com o tipo de classe base ou, de outro modo, tornando-a dependente, por exemplo, adicionando
um ponteiro this-> .
No /permissive- modo, o código a seguir agora gera C3861: 'base_value': identifier not found :
Para corrigir o erro, altere a return instrução para return this->base_value; .
Obser vação:Obser vação: Na biblioteca do Python Boost, há uma solução alternativa específica de MSVC para uma
declaração de encaminhamento de modelo em unwind_type. HPP. Em /permissive- modo começando no
Visual Studio 2017 versão 15,8 ( _ MSC _ Ver = 1915), o compilador MSVC faz a pesquisa de nome dependente
de argumento (ADL) corretamente. Agora é consistente com outros compiladores, tornando essa proteção
alternativa desnecessária. Para evitar o erro C3861: 'unwind_type': identifier not found , consulte PR 229 no
repositório de aumentos para atualizar o arquivo de cabeçalho. Já aplicamos patch no pacote Boost vcpkg,
portanto, se você obtiver ou atualizar suas fontes de Boost usando vcpkg, não será necessário aplicar o patch
separadamente.
https://docs.microsoft.com/pt-br/cpp/cpp/attributes
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://github.com/boostorg/python/blame/develop/include/boost/python/detail/unwind_type.hpp
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://github.com/boostorg/python/pull/229
https://docs.microsoft.com/pt-br/cpp/build/vcpkg
namespace std {
template<typename T> class vector;
}
#include <vector>
Construtores que delegam a si mesmosConstrutores que delegam a si mesmos
class X {
public:
X(int, int);
X(int v) : X(v){}
};
class X {
public:
X(int, int);
X(int v) : X(v, 0) {}
};
offsetof com expressões de constante com expressões de constante
O padrão C++ não permite que um usuário adicione declarações ou definições de encaminhamento no
namespace std . A adição de declarações ou de definições ao namespace std ou a um namespace no
namespace std agora resulta em um comportamento indefinido.
Em algum momento no futuro, a Microsoft mudará o local em que alguns tipos padrão são definidos. Essa
mudança interromperá o código existente que adiciona as declarações de encaminhamento ao namespace
std . Um novo aviso, o C4643, ajuda a identificar esses problemas de origem. O aviso é habilitado no
/default modo e é desativado por padrão. Ele afetará os programas que são compilados com o /Wall ou o
/WX .
O código a seguir agora gera C4643:
Forward declaring 'vector' in namespace std is not permitted by the C++ Standard .
Para corrigir o erro, use uma diretiva includeinclude em vez de uma declaração de encaminhamento:
O padrão C++ sugere que um compilador deve emitir um diagnóstico quando um construtor de delegação
delega a si mesmo. O compilador do Microsoft C++ no /std:c++17 e os /std:c++latest modos agora geram
C7535: 'X::X': delegating constructor calls itself .
Sem esse erro, o programa a seguir será compilado, mas gerará um loop infinito:
Para evitar o loop infinito, delegue para um construtor diferente:
offsetof normalmente tem sido implementado usando uma macro que requer um reinterpret_cast. Esse uso
não é válido em contextos que requerem uma expressão de constante, mas usualmente o compilador C++ da
Microsoft tem permitido isso. A macro offsetof que é fornecida como parte da biblioteca padrão usa
corretamente um compilador intrínseco ( __builtin_offsetof__builtin_offsetof ), mas muitas pessoas têm usado o truque da
macro para definir seu próprio offsetof .
No Visual Studio 2017 versão 15,8, o compilador restringe as áreas que esses reinterpret_cast operadores
podem aparecer no modo padrão, para ajudar o código a obedecer ao comportamento padrão do C++. Em
/permissive- , as restrições são ainda mais estritas. O uso do resultado de um offsetof em locais que exigem
expressões constantes pode resultar em código que emite aviso C4644
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/c-runtime-library/reference/offsetof-macro
https://docs.microsoft.com/pt-br/cpp/cpp/reinterpret-cast-operator
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
struct Data {
int x;
};
// Common pattern of user-defined offsetof
#define MY_OFFSET(T, m) (unsigned long long)(&(((T*)nullptr)->m))
int main()
{
switch (0) {
case MY_OFFSET(Data, x): return 0;
default: return 1;
}
}
#include <cstddef>
struct Data {
int x;
};
int main()
{
switch (0) {
case offsetof(Data, x): return 0;
default: return 1;
}
}
qualificadores de cv em classes base sujeitos a expansão de pacotequalificadores de cv em classes base sujeitos a expansão de pacote
template<typename... T>
class X : public T... { };
class S { };
int main()
{
X<const S> x;
}
Palavra-chave Palavra-chave template e especificadores de nome aninhados e especificadores de nome aninhados
usage of the macro-based offsetof pattern in constant expressions is non-standard; use offsetof defined in
the C++ standard library instead
ou C2975 invalid template argument, expected compile-time constant expression .
O código a seguir gera C4644 /default e /std:c++17 modos, e C2975no /permissive- modo:
Para corrigir o erro, use offsetof conforme definido por meio de <cstddef> :
As versões anteriores do compilador C++ da Microsoft não detectavam que uma classe base tinha
qualificadores de cv se ele também estivesse sujeito à expansão do pacote.
No Visual Studio 2017 versão 15,8, no /permissive- modo, o código a seguir gera C3770
'const S': is not a valid base class :
No /permissive- modo, o compilador agora requer que a template palavra-chave preceda um nome de
modelo quando ele vier após um especificador de nome aninhado dependente.
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
template<typename T> struct Base
{
template<class U> void example() {}
};
template<typename T>
struct X : Base<T>
{
void example()
{
Base<T>::example<int>();
}
};
template<typename T> struct Base
{
template<class U> void example() {}
};
template<typename T>
struct X : Base<T>
{
void example()
{
// Add template keyword here:
Base<T>::template example<int>();
}
};
Correções de bugs e alterações de comportamento em 15,9
Identificadores em modelos de alias de membroIdentificadores em modelos de alias de membro
template <typename... Ts>
struct A
{
public:
template <typename U>
using from_template_t = decltype(from_template(A<U>{}));
private:
template <template <typename...> typename Type, typename... Args>
static constexpr A<Args...> from_template(A<Type<Args...>>);
};
A<>::from_template_t<A<int>> a;
O código a seguir no /permissive- modo agora gera C7510:
'example': use of dependent template name must be prefixed with 'template'. note: see reference to class
template instantiation 'X<T>' being compiled
:
Para corrigir o erro, adicione a template palavra-chave à Base<T>::example<int>(); instrução, conforme
mostrado no exemplo a seguir :
Um identificador usado em uma definição de modelo de alias de membro precisa ser declarado antes de ser
usado.
Nas versões anteriores do compilador, o código a seguir era permitido:
No Visual Studio 2017 versão 15,9, no /permissive- modo, o compilador gera C3861:
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
Alterações nos módulosAlterações nos módulos
cl /EHsc /std:c++17 m.ixx /experimental:module
cl /experimental:module /module:reference m.ifc main.cpp /std:c++14
Ordenação parcial envolvendo aliases e contextos não deduzidosOrdenação parcial envolvendo aliases e contextos não deduzidos
'from_template': identifier not found .
Para corrigir o erro, declare from_template antes de from_template_t .
No Visual Studio 2017, versão 15.9, o compilador gera C5050 sempre que as opções de linha de comando dos
módulos não são consistentes entre os lados da criação do módulo e do consumo do módulo. No exemplo a
seguir, há dois problemas:
No lado de consumo (Main. cpp), a opção /EHsc não é especificada.
A versão C++ está /std:c++17 no lado da criação e /std:c++14 no lado do consumo.
O compilador gera C5050 para ambos os casos:
warning C5050: Possible incompatible environment while importing module 'm': mismatched C++ versions.
Current "201402" module version "201703"
.
O compilador também gera C7536 sempre que o arquivo .ifc é adulterado. O cabeçalho da interface do módulo
contém um hash SHA2 do conteúdo abaixo dele. Na importação, o arquivo. IFC é submetido a hash e, em
seguida, verificado em relação ao hash fornecido no cabeçalho. Se eles não corresponderem, o erro C7536 será
gerado:
ifc failed integrity checks. Expected SHA2:
'66d5c8154df0c71d4cab7665bab4a125c7ce5cb9a401a4d8b461b706ddd771c6'
.
As implementações divergem nas regras de ordenação parciais que envolvem aliases em contextos não
deduzidos. No exemplo a seguir, GCC e o compilador do Microsoft C++ (no /permissive- modo) geram um
erro, enquanto Clang aceita o código.
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
#include <utility>
using size_t = std::size_t;
template <typename T>
struct A {};
template <size_t, size_t>
struct AlignedBuffer {};
template <size_t len>
using AlignedStorage = AlignedBuffer<len, 4>;
template <class T, class Alloc>
int f(Alloc &alloc, const AlignedStorage<T::size> &buffer)
{
return 1;
}
template <class T, class Alloc>
int f(A<Alloc> &alloc, const AlignedStorage<T::size> &buffer)
{
return 2;
}
struct Alloc
{
static constexpr size_t size = 10;
};
int main()
{
A<void> a;
AlignedStorage<Alloc::size> buf;
if (f<Alloc>(a, buf) != 2)
{
return 1;
}
return 0;
}
partial_alias.cpp(32): error C2668: 'f': ambiguous call to overloaded function
partial_alias.cpp(18): note: could be 'int f<Alloc,void>(A<void> &,const AlignedBuffer<10,4> &)'
partial_alias.cpp(12): note: or 'int f<Alloc,A<void>>(Alloc &,const AlignedBuffer<10,4> &)'
with
[
Alloc=A<void>
]
partial_alias.cpp(32): note: while trying to match the argument list '(A<void>, AlignedBuffer<10,4>)'
O exemplo anterior gera C2668:
A divergência de implementação se deve a uma regressão na expressão do padrão C++. A resolução para
edição de núcleo de 2235 removeu algum texto que permitiria que essas sobrecargas fossem ordenadas. O
padrão C++ atual não fornece um mecanismo para ordenar parcialmente essas funções, portanto, elas são
consideradas ambíguas.
Como solução alternativa, é recomendável não depender de ordenação parcial para resolver esse problema. Em
vez disso, use SFINAE para remover sobrecargas específicas. No exemplo a seguir, usamos uma classe auxiliar
IsA para remover a primeira sobrecarga quando Alloc é uma especialização de A :
#include <utility>
using size_t = std::size_t;
template <typename T>
struct A {};
template <size_t, size_t>
struct AlignedBuffer {};
template <size_t len>
using AlignedStorage = AlignedBuffer<len, 4>;
template <typename T> struct IsA : std::false_type {};
template <typename T> struct IsA<A<T>> : std::true_type {};
template <class T, class Alloc, typename = std::enable_if_t<!IsA<Alloc>::value>>
int f(Alloc &alloc, const AlignedStorage<T::size> &buffer)
{
return 1;
}
template <class T, class Alloc>
int f(A<Alloc> &alloc, const AlignedStorage<T::size> &buffer)
{
return 2;
}
struct Alloc
{
static constexpr size_t size = 10;
};
int main()
{
A<void> a;
AlignedStorage<Alloc::size> buf;
if (f<Alloc>(a, buf) != 2)
{
return 1;
}
return 0;
}
Expressões ilegais e tipos não literais em definições de função com modeloExpressões ilegais e tipos não literais em definições de função com modelo
void g();
template<typename T>
struct S
{
constexpr void f();
};
template<>
constexpr void S<int>::f()
{
g(); // C3615 in 15.9
}
Expressões ilegais e tipos não literais agora são diagnosticados corretamente nas definições de funções com
modelo especializadas explicitamente. Anteriormente, esses erros não eram emitidos para a definição da
função. No entanto, o tipo não literal ou a expressão ilegal ainda teria sido diagnosticado se avaliado como
parte de uma expressão de constante.
Em versões anteriores do Visual Studio, o seguinte código é compilado sem aviso:
error C3615: constexpr function 'S<int>::f' cannot result in a constant expression.
note: failure was caused by call of undefined function or one not declared 'constexpr'
note: see usage of 'g'.
Aprimoramentos de conformidade do C++ no Visual Studio 2015
Confira também
No Visual Studio 2017 versão 15.9, o código aciona este erro:
Para evitar o erro, remova o constexpr qualificador da instanciação explícita da função f() .
Temos uma lista completa de melhorias de conformidade no Visual Studio 2015atualização 3. Para obter mais
informações, consulte Novidades no Visual C++ de 2003 até 2015.
Tabela de conformidade da linguagem Microsoft C++
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-what-s-new-2003-through-2015
Tabela de conformidade com a linguagem Microsoft
C++
12/11/2020 • 38 minutes to read • Edit Online
NOTENOTE
Recursos do compilador
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
Recursos de linguagem principal do c++ 03/11Recursos de linguagem principal do c++ 03/11 Com supor teCom supor te
O restante VS 2015
Pesquisa de nome de duas fases VS 2017 15.7
N2634 Expression SFINAE VS 2017 15.7
N1653 C99 preprocessor Parcial
Recursos de linguagem principal do c++ 14Recursos de linguagem principal do c++ 14 Com supor teCom supor te
N3323 Tweaked wording for contextual conversions VS 2013
N3472 Binary literals VS 2015
N3638 auto and decltype(auto) return types VS 2015
N3648 init-captures VS 2015
N3649 Generic lambdas VS 2015
Conformidade com padrões para o compilador do Microsoft C++ no Visual Studio (MSVC) é um trabalho em
andamento. Aqui está um resumo de nossa linguagem ISO padrão do C++ e a conformidade da biblioteca pela
versão do Visual Studio. Cada compilador e nome de recurso de biblioteca padrão são links para o documento
de proposta de C++ padrão ISO que descreve o recurso, se houver um disponível no momento da publicação. A
coluna com supor tecom supor te lista a versão do Visual Studio na qual o suporte para o recurso apareceu pela primeira
vez.
Para obter detalhes sobre os aprimoramentos de conformidade do Visual Studio 2017 ou do Visual Studio 2019
MSVC, consulte melhorias de conformidade do C++ no Visual Studio. Para obter uma lista de outras alterações,
consulte What ' s New for Visual C++ in Visual Studio. Para alterações de compatibilidade em versões
anteriores, consulte Histórico de alterações do Visual C++ e Novidades do Visual C++ de 2003 a 2015. Para
saber mais sobre as últimas notícias da equipe do C++, visite o blog da equipe do C++.
Não há alterações da falha do binário entre o Visual Studio 2015, Visual Studio 2017 e Visual Studio 2019. Para obter mais
informações, consulte compatibilidade binária de C++ entre o Visual Studio 2015, 2017 e 2019
A
B
C
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/visual-cpp-language-conformance.md
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-change-history-2003-2015
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-what-s-new-2003-through-2015
https://devblogs.microsoft.com/cppblog/
https://docs.microsoft.com/pt-br/cpp/porting/binary-compat-2015-2017
https://wg21.link/N2634
https://wg21.link/N1653
https://wg21.link/N3323
https://wg21.link/N3472
https://wg21.link/n3638
https://wg21.link/n3648
https://wg21.link/n3649
N3760 [[deprecated]] attribute VS 2015
N3778 Sized deallocation VS 2015
N3781 Digit separators VS 2015
N3651 Variable templates VS 2015.2
N3652 Extended constexpr VS 2017 15.0
N3653 Default member initializers for aggregates VS 2017 15.0
Recursos de linguagem principal do c++ 17Recursos de linguagem principal do c++ 17 Com supor teCom supor te
N4086 Removing trigraphs VS 2010
N3922 New rules for auto with braced-init-lists VS 2015
N4051 typename in template template-parameters VS 2015
N4266 Attributes for namespaces and enumerators VS 2015
N4267 u8 character literals VS 2015
N4230 Nested namespace definitions VS 2015.3
N3928 Terse static_assert VS 2017 15.0
P0184R0 Generalized range-based for-loops VS 2017 15.0
P0188R1 [[fallthrough]] attribute VS 2017 15.0
P0001R1 Removing the register keyword VS 2017 15.3
P0002R1 Removing operator++ for bool VS 2017 15.3
P0018R3 Capturing *this by value VS 2017 15.3
P0028R4 Using attribute namespaces without
repetition
VS 2017 15.3
P0061R1 __has_include VS 2017 15.3
P0138R2 Direct-list-init of fixed enums from
integers
VS 2017 15.3
P0170R1 constexpr lambdas VS 2017 15.3
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
14
14
14
14
14
17
17
14
17
17
17
17
17
14
17
17
https://wg21.link/n3760
https://wg21.link/n3778
https://wg21.link/n3781
https://wg21.link/n3651
https://wg21.link/n3652
https://wg21.link/n3653
https://wg21.link/n4086
https://wg21.link/n3922
https://wg21.link/n4051
https://wg21.link/n4266
https://wg21.link/n4267
https://wg21.link/n4230
https://wg21.link/n3928
https://wg21.link/p0184r0
https://wg21.link/p0188r1
https://wg21.link/p0001r1
https://wg21.link/p0002r1
https://wg21.link/p0018r3
https://wg21.link/p0028r4
https://wg21.link/p0061r1
https://wg21.link/p0138r2
https://wg21.link/p0170r1
P0189R1 [[nodiscard]] attribute VS 2017 15.3
P0212R1 [[maybe_unused]] attribute VS 2017 15.3
P0217R3 Structured bindings VS 2017 15.3
P0292R2 constexpr if-statements VS 2017 15.3
P0305R1 Selection statements with initializers VS 2017 15.3
P1381R1 Reference capture of structured bindings VS 2017 15.3
P0245R1 Hexfloat literals VS 2017 15.5
N4268 Allowing more non-type template args VS 2017 15.5
N4295 Fold expressions VS 2017 15.5
P0003R5 Removing dynamic-exception-specifications VS 2017 15.5
P0012R1 Adding noexcept to the type system VS 2017 15.5
P0035R4 Over-aligned dynamic memory allocation VS 2017 15.5
P0386R2 Inline variables VS 2017 15.5
P0522R0 Matching template template-parameters to
compatible arguments
VS 2017 15.5
P0036R0 Removing some empty unary folds VS 2017 15.5
N4261 Fixing qualification conversions VS 2017 15,7
P0017R1 Extended aggregate initialization VS 2017 15,7
P0091R3 Template argument deduction for class
templates
P0512R0 Class template argument deduction issues
VS 2017 15,7
P0127R2 Declaring non-type template parameters with
auto
VS 2017 15,7
P0135R1 Guaranteed copy elision VS 2017 15.6
P0136R1 Rewording inheriting constructors VS 2017 15,7
P0137R1 std::launder VS 2017 15,7
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
17
17
17
D
17
17
17
17
17
17
17
17
17
17
17
17
17
17
17
17
17
https://wg21.link/p0189r1
https://wg21.link/p0212r1
https://wg21.link/p0217r3
https://wg21.link/p0292r2
https://wg21.link/p0305r1
https://wg21.link/P1381R1
https://wg21.link/p0245r1
https://wg21.link/n4268
https://wg21.link/n4295
https://wg21.link/p0003r5
https://wg21.link/p0012r1
https://wg21.link/p0035r4
https://wg21.link/p0386r2
https://wg21.link/p0522r0
https://wg21.link/p0036r0
https://wg21.link/n4261
https://wg21.link/p0017r1
https://wg21.link/p0091r3
https://wg21.link/p0512r0
https://wg21.link/p0127r2
https://wg21.link/p0135r1
https://wg21.link/p0136r1
https://wg21.link/p0137r1
P0145R3 Refining expression evaluation order
P0400R0 Order of evaluation of function arguments
VS 2017 15,7
P0195R2 Pack expansions in using-declarations VS 2017 15,7
P0283R2 Ignoring unrecognized attributes VS 2015
Recursos de linguagem principal do c++ 17Recursos de linguagem principal do c++ 17
(relatórios de defeito)(relatórios de defeito)
Com supor teCom supor te
P0702R1 Fixing class template argument deduction
for initializer-list ctors
VS 2017 15,7
P0961R1 Relaxing the structured bindings
customization point finding rules
VS 2019 16.0
P0969R0 Allowing structured bindings to accessible
members
VS 2019 16.0
P0588R1 Simplifying implicit lambda capture VS 2019 16,4
P1771R1 [[nodiscard]] for constructors VS 2019 16,4
P1825R0 Merged wording for P0527R1 and P1155R3,
more implicit moves
VS 2019 16,4
P0929R2 Checking for abstract class types VS 2019 16,5
P0962R2 Relaxing the range-for loop customization
point finding rules
VS 2019 16,5
P0859R0 CWG 1581: When are constexpr member
functions defined
Não
P1009R2 Array size deduction in new-expressions VS 2019 16,7
P1286R2 Contra CWG DR1778 VS 2019 16,8
Recursos de linguagem principal do c++ 20Recursos de linguagem principal do c++ 20 Com supor teComsupor te
P0704R1 Fixing const lvalue ref-qualified pointers
to members
VS 2015
P1041R4 Make char16_t/char32_t string literals be
UTF-16/32
VS 2015
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
17
17
14
17
17
17
17
17
17
17
17
17
17
14
14
https://wg21.link/p0145r3
https://wg21.link/p0400r0
https://wg21.link/p0195r2
https://wg21.link/p0283r2
https://wg21.link/p0702r1
https://wg21.link/p0961r1
https://wg21.link/p0969r0
https://wg21.link/p0588r1
https://wg21.link/p1771r1
https://wg21.link/p1825r0
https://wg21.link/P0929R2
https://wg21.link/p0962r1
https://wg21.link/p0859r0
https://wg21.link/P1009R2
https://wg21.link/P1286R2
https://wg21.link/p0704r1
https://wg21.link/P1041R4
P1330R0 Changing the active member of a union
inside constexpr
VS 2017 15.0
P0972R0 noexcept For <chrono> zero(), min(), max() VS 2017 15.7
P0515R3 Three-way (spaceship) comparison operator
<=>
VS 2019 16.0
P0941R2 Feature-test macros VS 2019 16.0
P1008R1 Prohibiting aggregates with user-declared
constructors
VS 2019 16.0
P0329R4 Designated initialization VS 2019 16.1
P0846R0 ADL and function templates that are not
visible
VS 2019 16.1
P0409R2 Allowing lambda-capture [=, this] VS 2019 16,2
P0428R2 Familiar template syntax for generic
lambdas
VS 2019 16,2
P0624R2 Default constructible and assignable
stateless lambdas
VS 2019 16,2
P0780R2 Allowing pack expansion in lambda init-
capture
VS 2019 16,2
P0806R2 Deprecate implicit capture of this via [=] VS 2019 16,2
P1120R0 Consistency improvements for <=> and other
comparison operators
VS 2019 16,2
P1185R2 <=> != == VS 2019 16,2
P0734R0 Concepts VS 2019 16,3
P0857R0 Fixing functionality gaps in constraints VS 2019 16,3
P1084R2 Today's return-type-requirements are
insufficient
VS 2019 16,3
P0892R2 Conditional explicit VS 2019 16,4
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
14
14
20
14
20
20
20
20
20
20
20
20
20
20
20
20
20
20
https://wg21.link/P1330R0
https://wg21.link/P0972R0
https://wg21.link/P0515R3
https://wg21.link/P0941R2
https://wg21.link/P1008R1
https://wg21.link/p0329r4
https://wg21.link/P0846R0
https://wg21.link/p0409r2
https://wg21.link/p0428r2
https://wg21.link/P0624R2
https://wg21.link/P0780R2
https://wg21.link/P0806R2
https://wg21.link/P1120R0
https://wg21.link/P1185R2
https://wg21.link/P0734R0
https://wg21.link/P0857R0
https://wg21.link/P1084R2
https://wg21.link/P0892R2
P1091R3 Extending structured bindings to be more
like variable declarations
VS 2019 16,4
P1099R5 Using enum VS 2019 16,4
P1186R3 When do you actually use <=> VS 2019 16,4
P1630R1 Spaceship needs a tune-up VS 2019 16,4
P0306R4 Adding __VA_OPT__ for comma omission and
comma deletion
VS 2019 16,5
P0614R1 Range-based for-loops with initializers VS 2019 16,5
P0683R1 Default member initializers for bit-fields VS 2019 16,5
P1002R1 try-catch blocks in constexpr functions VS 2019 16,5
P1161R3 Deprecate uses of the comma operator in
subscripting expressions
VS 2019 16,5
P1301R4 [[nodiscard("message")]] VS 2019 16,5
P1703R1 Recognizing header unit imports requires
full preprocessing
VS 2019 16,5
P1946R0 Allow defaulting comparisons by value VS 2019 16,5
P0479R5 [[likely]] and [[unlikely]] attributes VS 2019 16,6
P0692R1 Relaxing access checking on specializations
VS 2019 16,6
P0732R2 Class types in non-type template parameters
VS 2019 16,6
P1139R2 Address wording issues related to ISO 10646
VS 2019 16,6
P1907R1 Inconsistencies with non-type template
parameters
VS 2019 16,6
P1971R0 US053: Mandate the return type for
return_void and return_value to be void
VS 2019 16,6
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
20
20
20
20
20
20
20
20
20
20
20
20
20
14
20
14
20
20
https://wg21.link/P1091R3
https://wg21.link/P1099R5
https://wg21.link/P1186R3
https://wg21.link/P1630R1
https://wg21.link/P0306R4
https://wg21.link/P0614R1
https://wg21.link/P0683R1
https://wg21.link/P1002R1
https://wg21.link/P1161R3
https://wg21.link/P1301R4
https://wg21.link/P1703R1
https://wg21.link/P1946R0
https://wg21.link/P0479R5
https://wg21.link/P0692R1
https://wg21.link/P0732R2
https://wg21.link/P1139R2
https://wg21.link/P1907R1
https://wg21.link/P1971R0
P1971R0 US065: Apply Coroutines issue 24 from
P0664R8
VS 2019 16,6
P1979R0 Resolution to US086 VS 2019 16,6
P0388R4 Permit conversions to arrays of unknown
bound
VS 2019 16,7
P0466R5 Layout-compatibility and Pointer-
interconvertibility Traits
VS 2019 16,7
P0722R3 Efficient sized delete for variable sized
classes
VS 2019 16,7
P1094R2 Nested inline namespaces VS 2019 16,7
P1152R4 Deprecating volatile VS 2019 16,7
P1331R2 Permitting trivial default initialization
in constexpr contexts
VS 2019 16,7
P1358R0 2310: Type completeness and derived-to-base
pointer conversions
VS 2019 16,7
P1452R2 On the non-uniform semantics of return-
type-requirements
VS 2019 16,7
P1616R1 Using unconstrained TTPs with constrained
templates
VS 2019 16,7
P1814R0 CTAD for alias templates VS 2019 16,7
P1816R0 CTAD for aggregates VS 2019 16,7
P1957R1 Converting from T* to bool should be
considered narrowing (re: US 212)
VS 2019 16,7
P1968R0 CWG 2282: Consistency with mismatched
aligned/non-over-aligned allocation/deallocation
functions
VS 2019 16,7
P1969R0 CWG 2280: Matching a usual deallocation
function with placement new
VS 2019 16,7
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
20
20
20
20
20
20
20
20
20
20
20
20
20
Dr
20
20
https://wg21.link/P1971R0
https://wg21.link/P1979R0
https://wg21.link/P0388R4
https://wg21.link/P0466R5
https://wg21.link/P0722R3
https://wg21.link/P1094R2
https://wg21.link/P1152R4
https://wg21.link/P1331R2
https://wg21.link/P1358R0
https://wg21.link/P1452R2
https://wg21.link/P1616R1
https://wg21.link/P1814R0
https://wg21.link/P1816R0
https://wg21.link/P1957R1
https://wg21.link/P1968R0#2282
https://wg21.link/CWG2280
P1969R0 CWG 2382: Array allocation overhead for
non-allocating placement new
VS 2019 16,7
P1969R0 CWG 2441: Inline function parameters VS 2019 16,7
P1971R0 US052: Non-executed return statements in
coroutines
VS 2019 16,7
P1972R0 US105: Check satisfaction of constraints
for non-templates when forming pointer to function
VS 2019 16,7
P1980R0 CA096: Declaration matching for non-
dependent requires-clauses
VS 2019 16,7
P2082R1 Fixing CTAD for aggregates VS 2019 16,7
P2085R0 Consistent defaulted comparisons VS 2019 16,7
P2103R0 US033: Allow "import" inside linkage-
specifications
VS 2019 16,7
P2107R0 US064: Copy semantics of coroutine
parameters
VS 2019 16,7
P0912R5 Coroutines VS 2019 16,8
P1103R3 Modules VS 2019 16,8
P0315R4 Allowing lambdas in unevaluated contexts VS 2019 16,8
P0848R3 Conditionally trivial special member
functions
VS 2019 16,8
P0960R3 Allow initializing aggregates from a
parenthesized list of values
VS 2019 16,8
P1766R1 Mitigating minor modules maladies VS 2019 16,8
P1811R0 Relaxing redefinition restrictions for re-
exportation robustness
VS 2019 16,8
P1874R1 Dynamic Initialization Order of Non-Local
Variables in Modules
VS 2019 16,8
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
https://wg21.link/p1969r0#2382
https://wg21.link/p1969r0#2441
https://wg21.link/P1971R0
https://wg21.link/P1972R0
https://wg21.link/P1980R0
https://wg21.link/P2082R1
https://wg21.link/P2085R0
https://wg21.link/P2103R0
https://wg21.link/P2107R0
https://wg21.link/P0912R5
https://wg21.link/P1103R3
https://wg21.link/P0315R4
https://wg21.link/P0848R3
https://wg21.link/P0960R3
https://wg21.link/P1766R1
https://wg21.link/P1811R0
https://wg21.link/P1874R1
P1975R0 Fixing the wording of parenthesized
aggregate-initialization
VS 2019 16,8
P0641R2 const mismatch withdefaulted copy
constructor
Parcial
P1141R2 Yet another approach for constrained
declarations
Parcial
P0634R3 Down with typename! Não
P0784R7 More constexpr containers Não
P0840R2 [[no_unique_address]] attribute Não
P1064R0 Allowing virtual function calls in constant
expressions
Não
P1073R3 Immediate functions Não
P1143R2 constinit Não
P1327R1 Allowing dynamic_cast, polymorphic typeid
in constant expressions
Não
P1353R0 Missing feature-test macros Não
P1668R1 Permitting unevaluated inline assembly in
constexpr functions
Não
P0735R1 Interaction of memory_order_consume with
release sequences
N/D
P1236R1 Signed integers are two's complement N/D
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
Recursos da biblioteca padrão
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
Recursos de biblioteca padrão do c++ 20Recursos de biblioteca padrão do c++ 20 Com supor teCom supor te
P0809R0 Comparing Unordered Containers VS 2010
20
Uma lista mais detalhada de recursos de biblioteca padrão e correções de bugs por versão do produto está
disponível na página de changelog do Microsoft STL wiki do GitHub .
14
https://wg21.link/P1975R0
https://wg21.link/P0641R2
https://wg21.link/P1141R2
https://wg21.link/P0634R3
https://wg21.link/P0784R7
https://wg21.link/P0840R2
https://wg21.link/P1064R0
https://wg21.link/P1073R3
https://wg21.link/P1143R2
https://wg21.link/P1327R1
https://wg21.link/P1353R0
https://wg21.link/P1668R1
https://wg21.link/P0735R1
https://wg21.link/P1236R1
https://github.com/microsoft/STL/wiki/Changelog
https://wg21.link/p0809r0
P0858R0 Constexpr Iterator Requirements VS 2017 15.3
P0777R1 Avoiding Unnecessary Decay VS 2017 15.7
P1164R1 Making create_directory() Intuitive VS 2019 16.0
P0550R2 remove_cvref VS 2019 16.0
P0318R1 unwrap_reference, unwrap_ref_decay VS 2019 16.1
P0457R2 starts_with()/ends_with() For
basic_string/basic_string_view
VS 2019 16.1
P0458R2 contains() For Ordered And Unordered
Associative Containers
VS 2019 16.1
P0646R1 list/forward_list
remove()/remove_if()/unique() Return size_type
VS 2019 16.1
P0769R2 shift_left(), shift_right() VS 2019 16.1
P0887R1 type_identity VS 2019 16.1
P0020R6 atomic<float>, atomic<double>, atomic<long
double>
VS 2019 16,2
P0463R1 endian VS 2019 16,2
P0482R6 char8_t: A type for UTF-8 characters and
strings
VS 2019 16,2
P0600R1 [[nodiscard]] For The STL, Part 1 VS 2019 16,2
P0653R2 to_address() VS 2019 16,2
P0754R2 <version> VS 2019 16,2
P0771R1 noexcept For std::function's Move
Constructor
VS 2019 16,2
P0487R1 Fixing operator>>(basic_istream&, CharT*) VS 2019 16,3
P0616R0 Using move() In <numeric> VS 2019 16,3
P0758R1 is_nothrow_convertible VS 2019 16,3
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
17
14
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
https://wg21.link/p0858r0
https://wg21.link/p0777r1
https://wg21.link/P1164R1
https://wg21.link/p0550r2
https://wg21.link/p0318r1
https://wg21.link/p0457r2
https://wg21.link/p0458r2
https://wg21.link/p0646r1
https://wg21.link/p0769r2
https://wg21.link/p0887r1
https://wg21.link/p0020r6
https://wg21.link/p0463r1
https://wg21.link/P0482R6
https://wg21.link/p0600r1
https://wg21.link/p0653r2
https://wg21.link/p0754r2
https://wg21.link/P0771R1
https://wg21.link/P0487R1
https://wg21.link/p0616r0
https://wg21.link/P0758R1
P0898R3 Standard Library Concepts VS 2019 16,3
P0919R3 Heterogeneous Lookup For Unordered
Containers
VS 2019 16,3
P1754R1 Rename Concepts to standard_case VS 2019 16,4
P0325R4 to_array from LFTS with updates VS 2019 16,5
P0340R3 SFINAE-Friendly underlying_type VS 2019 16,5
P0356R5 bind_front() VS 2019 16,5
P0439R0 enum class memory_order VS 2019 16,5
P0553R4 <bit> Rotating And Counting Functions VS 2019 16,5
P0556R3 <bit> ispow2(), ceil2(), floor2(), log2p1()
VS 2019 16,5
P0595R2 is_constant_evaluated() VS 2019 16,5
P0631R8 <numbers> Math Constants VS 2019 16,5
P0655R1 visit<R>() VS 2019 16,5
P0738R2 istream_iterator Cleanup VS 2019 16,5
P0767R1 Deprecating is_pod VS 2019 16,5
P0966R1 string::reserve() Should Not Shrink VS 2019 16,5
P1209R0 erase_if(), erase() VS 2019 16,5
P1227R2 Signed std::ssize(), Unsigned span::size() VS 2019 16,5
P1355R2 Narrow Contract For ceil2() VS 2019 16,5
P1357R1 is_bounded_array, is_unbounded_array VS 2019 16,5
P1612R1 Relocating endian To <bit> VS 2019 16,5
P1651R0 bind_front() Should Not Unwrap
reference_wrapper
VS 2019 16,5
P1690R1 Refining Heterogeneous Lookup For Unordered
Containers
VS 2019 16,5
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
20
20
20
20
14
20
20
20
20
20
20
20
14
20
20
20
20
20
20
20
20
20
https://wg21.link/P0898R3
https://wg21.link/P0919R3
https://wg21.link/P1754R1
https://wg21.link/P0325R4
https://wg21.link/P0340R3
https://wg21.link/P0356R5
https://wg21.link/p0439r0
https://wg21.link/P0553R4
https://wg21.link/P0556R3
https://wg21.link/P0595R2
https://wg21.link/P0631R8
https://wg21.link/P0655R1
https://wg21.link/P0738R2
https://wg21.link/P0767R1
https://wg21.link/P0966R1
https://wg21.link/P1209R0
https://wg21.link/P1227R2
https://wg21.link/P1355R2
https://wg21.link/P1357R1
https://wg21.link/P1612R1
https://wg21.link/P1651R0
https://wg21.link/P1690R1
P1902R1 Missing Feature-Test Macros 2017-2019 VS 2019 16,5
P0122R7 <span>
P1024R3 Enhancing span usability
P1085R2 Removing span comparisons
P1394R4 Range constructor for span
P1872R0 span should have size_type, not index_type
VS 2019 16,6
P0202R3 constexpr for <algorithm> and exchange() VS 2019 16,6
P0357R3 Supporting Incomplete Types In
reference_wrapper
VS 2019 16,6
P0619R4 Removing C++17-Deprecated Features In C++20
VS 2019 16,6
P0879R0 constexpr for swapping functions VS 2019 16,6
P0883R2 Fixing atomic initialization VS 2019 16,6
P0935R0 Eradicating Unnecessarily Explicit Default
Constructors
VS 2019 16,6
P1006R1 constexpr For
pointer_traits<T*>::pointer_to()
VS 2019 16,6
P1165R1 Consistently Propagating Stateful
Allocators In basic_string's operator+()
VS 2019 16,6
P1423R3 char8_t backward compatibility remediation VS 2019 16,6
P1645R1 constexpr for <numeric> algorithms VS 2019 16,6
P0415R1 constexpr For <complex> (Again) VS 2019 16,7
P0476R2 <bit> bit_cast VS 2019 16,7
P0528R3 Atomic Compare-And-Exchange With Padding
Bits
VS 2019 16,7
P0586R2 Integer comparison functions VS 2019 16,7
P0674R1 make_shared() For Arrays VS 2019 16,7
P0718R2 atomic<shared_ptr<T>>, atomic<weak_ptr<T>> VS 2019 16,7
P1023R0 constexpr For std::array Comparisons VS 2019 16,7
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
14
20
20
20
20
20
14
14
20
14
20
20
20
20
20
20
20
20
20
https://wg21.link/P1902R1
https://wg21.link/p0122r7
https://wg21.link/p1024r3
https://wg21.link/p1085r2
https://wg21.link/p1394r4
https://wg21.link/p1872r0
https://wg21.link/p0202r3
https://wg21.link/P0357R3
https://wg21.link/P0619R4
https://wg21.link/P0879R0
https://wg21.link/P0883R2
https://wg21.link/P0935R0
https://wg21.link/P1006R1
https://wg21.link/P1165R1
https://wg21.link/P1423R3
https://wg21.link/P1645R1
https://wg21.link/p0415r1
https://wg21.link/P0476R2
https://wg21.link/P0528R3
https://wg21.link/P0586R2
https://wg21.link/p0674r1
https://wg21.link/p0718r2
https://wg21.link/P1023R0
P1115R3 erase()/erase_if() Return size_type VS 2019 16,7
P1831R1 Deprecating volatile in the standard
library
VS 2019 16,7
P1871R1 Concept traits should be named after
concepts
VS 2019 16,7
P1956R1 <bit> has_single_bit(), bit_ceil(),
bit_floor(), bit_width()
VS 2019 16,7
P1964R2 Replacing boolean With boolean-testable VS 2019 16,7
P1976R2 Fixed-size span construction from dynamic
range
VS 2019 16,7
P2091R0 Issues with range access CPOs VS 2019 16,7
P2102R0 Make "implicit expression variations"more
explicit
VS 2019 16,7
P2116R0 Remove tuple-like protocol support from
fixed-extent span
VS 2019 16,7
P0019R8 atomic_ref VS 2019 16,8
P0528R3 Library support for atomic compare-and-
exchange with padding bits
VS 2019 16,8
P0811R3 midpoint(), lerp() Parcial no VS 2019 16,3, concluído em 16,8
P0912R5 Library Support For Coroutines VS 2019 16,8
P1001R2 execution::unseq VS 2019 16,8
P1032R1 Miscellaneous constexpr VS 2019 16,8
P1065R2 constexpr INVOKE VS 2019 16,8
P1123R0 Editorial Guidance for merging P0019r8 and
P0528r3
VS 2019 16,8
P1135R6 The C++20 Synchronization Library VS 2019 16,8
P1960R0 NB Comment Changes Reviewed by SG1 VS 2019 16,8
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
20
https://wg21.link/P1115R3
https://wg21.link/P1831R1
https://wg21.link/P1831R1
https://wg21.link/P1956R1
https://wg21.link/P1964R2
https://wg21.link/P1976R2
https://wg21.link/P2091R0
https://wg21.link/P2102R0
https://wg21.link/P2116R0
https://wg21.link/P0019R8
https://wg21.link/P0528R3
https://wg21.link/P0811R3
https://wg21.link/P0912R5
https://wg21.link/P1001R2
https://wg21.link/P1032R1
https://wg21.link/P1065R2
https://wg21.link/P1123R0
https://wg21.link/P1135R6
https://wg21.link/P1960R0
P0053R7 <syncstream>
P0753R2 osyncstream Manipulators
Não
P0339R6 polymorphic_allocator<> Não
P0355R7 <chrono> Calendars And Time Zones Não
P0408R7 Efficient access To basic_stringbuf's
buffer
Não
P0466R5 Library support for layout-compatibility
and pointer-interconvertibility traits
Não
P0475R1 Guaranteed Copy Elision For Piecewise
Construction
Não
P0591R4 Utility Functions For Uses-Allocator
Construction
Não
P0608R3 Improving variant's Converting
Constructor/Assignment
Não
P0645R10 <format> Text Formatting Não
P0660R10 <stop_token> and jthread Não
P0768R1 Library Support For The Spaceship
Comparison Operator <=>
Parcial no VS 2019 16,0
P0784R7 Library support for more constexpr
containers
Parcial no VS 2019 16,7
P0896R4 <ranges> Parcial no VS 2019 16,8
P0980R1 constexpr std::string Não
P1004R2 constexpr std::vector Não
P1007R3 assume_aligned() Não
P1020R1 Smart Pointer Creation With Default
Initialization
Não
P1208R6 <source_location> Não
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
20
20
20
https://wg21.link/p0053r7
https://wg21.link/p0753r2
https://wg21.link/P0339R6
https://wg21.link/p0355r7
https://wg21.link/p0408r7
https://wg21.link/p0466r5
https://wg21.link/P0475R1
https://wg21.link/P0591R4
https://wg21.link/P0608R3
https://wg21.link/p0645r10
https://wg21.link/p0660r10
https://wg21.link/p0768r1
https://wg21.link/P0784R7
https://wg21.link/P0896R4
https://wg21.link/P0980R1
https://wg21.link/P1004R2
https://wg21.link/P1007R3
https://wg21.link/P1020R1
https://wg21.link/P1208R6
P1285R0 Improving Completeness Requirements For
Type Traits
Não
P1502R1 Standard Library Header Units Não
P1614R2 Adding Spaceship <=> To The Library Parcial no VS 2019 16,7
P1771R1 Library support for [[nodiscard]] for
constructors
Não
Recursos de biblioteca padrão do c++ 17Recursos de biblioteca padrão do c++ 17 Com supor teCom supor te
LWG 2221 Formatted output operator for nullptr VS 2019 16.1
N3911 void_t VS 2015
N4089 Safe Conversions In unique_ptr<T[]> VS 2015
N4169 invoke() VS 2015
N4190 Removing auto_ptr, random_shuffle(), And Old
<functional> Stuff
VS 2015
N4258 noexcept Cleanups VS 2015
N4259 uncaught_exceptions() VS 2015
N4277 Trivially Copyable reference_wrapper VS 2015
N4279 insert_or_assign()/try_emplace() For
map/unordered_map
VS 2015
N4280 size(), empty(), data() VS 2015
N4366 Precisely Constraining unique_ptr Assignment VS 2015
N4387 Improving pair And tuple VS 2015.2
N4389 bool_constant VS 2015
N4508 shared_mutex (Untimed) VS 2015.2
N4510 Supporting Incomplete Types In
vector/list/forward_list
VS 2013
N4562 Library Fundamentals: <algorithm> sample() VS 2017 15.0
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
20
14
14
14
rem
14
14
14
14
14
14
14
14
14
14
https://wg21.link/P1285R0
https://wg21.link/P1502R1
https://wg21.link/P1614R2
https://wg21.link/P1771R1
https://cplusplus.github.io/LWG/issue2221
https://wg21.link/n3911
https://wg21.link/n4089
https://wg21.link/n4169
https://wg21.link/n4190
https://wg21.link/n4258
https://wg21.link/n4259
https://wg21.link/n4277
https://wg21.link/n4279
https://wg21.link/n4280
https://wg21.link/n4366
https://wg21.link/n4387
https://wg21.link/n4389
https://wg21.link/n4508
https://wg21.link/n4510
https://wg21.link/n4562#alg.random.sample
N4562 Library Fundamentals: <any> VS 2017 15.0
N4562 Library Fundamentals: <memory_resource>
P0337R0 Deleting polymorphic_allocator Assignment
VS 2017 15.6
N4562 Library Fundamentals: <optional> VS 2017 15.0
N4562 Library Fundamentals: <string_view> VS 2017 15.0
N4562 Library Fundamentals: <tuple> apply() VS 2017 15.0
N4562 Library Fundamentals: Boyer-Moore search()
P0253R1 Fixing Searcher Return Types
VS 2017 15.3
P0003R5 Removing Dynamic Exception Specifications VS 2017 15.5
P0004R1 Removing Deprecated Iostreams Aliases VS 2015.2
P0005R4 not_fn()
P0358R1 Fixes For not_fn()
VS 2017 15.5
P0006R0 Variable Templates For Type Traits
(is_same_v, etc.)
VS 2015.2
P0007R1 as_const() VS 2015.2
P0013R1 Logical Operator Type Traits (conjunction,
etc.)
VS 2015.2
P0024R2 Parallel Algorithms
P0336R1 Renaming Parallel Execution Policies
P0394R4 Parallel Algorithms Should terminate() For
Exceptions
P0452R1 Unifying <numeric> Parallel Algorithms
VS 2017 15.7
P0025R1 clamp() VS 2015.3
P0030R1 hypot(x, y, z) VS 2017 15.7
P0031R0 constexpr For <array> (Again) And
<iterator>
VS 2017 15.3
P0032R3 Homogeneous Interface For
variant/any/optional
VS 2017 15.0
P0033R1 Rewording enable_shared_from_this VS 2017 15.5
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
17
17
rem
17
14
14
14
17
14
https://wg21.link/n4562#any
https://wg21.link/n4562#memory.resource.synop
https://wg21.link/p0337r0
https://wg21.link/n4562#optional
https://wg21.link/n4562#string.view
https://wg21.link/n4562#tuple
https://wg21.link/n4562#func.searchers.boyer_moore
https://wg21.link/p0253r1
https://wg21.link/p0003r5
https://wg21.link/p0004r1
https://wg21.link/p0005r4
https://wg21.link/p0358r1
https://wg21.link/p0006r0
https://wg21.link/p0007r1
https://wg21.link/p0013r1
https://wg21.link/p0024r2
https://wg21.link/p0336r1
https://wg21.link/p0394r4
https://wg21.link/p0452r1
https://wg21.link/p0025r1
https://wg21.link/p0030r1
https://wg21.link/p0031r0
https://wg21.link/p0032r3
https://wg21.link/p0033r1
P0040R3 Extending Memory Management Tools VS 2017 15.3
P0063R3 C11 Standard Library VS 2015
P0067R5 Elementary String Conversions VS 2019 16,4
P0074R0 owner_less<> VS 2015.2
P0077R2 is_callable, is_nothrow_callable VS 2017 15.0
P0083R3 Splicing Maps And Sets
P0508R0 Clarifying insert_return_type
VS 2017 15.5
P0084R2 Emplace Return Type VS 2017 15.3
P0088R3 <variant> VS 2017 15.0
P0092R1 <chrono> floor(), ceil(), round(), abs() VS 2015.2
P0152R1 atomic::is_always_lock_free VS 2017 15.3
P0154R1 hardware_destructive_interference_size,
etc.
VS 2017 15.3
P0156R0 Variadic lock_guard VS 2015.2
P0156R2 Renaming Variadic lock_guard to scoped_lock
VS 2017 15.3
P0163R0 shared_ptr::weak_type VS 2017 15.0
P0174R2 Deprecating Vestigial Library Parts VS 2017 15.5
P0185R1 is_swappable, is_nothrow_swappable VS 2015.3
P0209R2 make_from_tuple() VS 2017 15.0
P0218R1 <filesystem>
P0219R1 Relative Paths For Filesystem
P0317R1 Directory Entry Caching For Filesystem
P0392R0 Supporting string_view In Filesystem Paths
P0430R2 Supporting Non-POSIX Filesystems
P0492R2 Resolving NB Comments for Filesystem
VS 2017 15.7
P0220R1 LibraryFundamentals V1 VS 2017 15.6
P0226R1 Mathematical Special Functions VS 2017 15.7
P0254R2 Integrating string_view And std::string VS 2017 15.0
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
17
C11, 14
ch arcon v
14
17
17
14
17
17
14
17
17
E
https://wg21.link/p0040r3
https://wg21.link/p0063r3
https://wg21.link/p0067r5
https://wg21.link/p0074r0
https://wg21.link/p0077r2
https://wg21.link/p0083r3
https://wg21.link/p0508r0
https://wg21.link/p0084r2
https://wg21.link/p0088r3
https://wg21.link/p0092r1
https://wg21.link/p0152r1
https://wg21.link/p0154r1
https://wg21.link/p0156r0
https://wg21.link/p0156r2
https://wg21.link/p0163r0
https://wg21.link/p0174r2
https://wg21.link/p0185r1
https://wg21.link/p0209r2
https://wg21.link/p0218r1
https://wg21.link/p0219r1
https://wg21.link/p0317r1
https://wg21.link/p0392r0
https://wg21.link/p0430r2
https://wg21.link/p0492r2
https://wg21.link/p0220r1
https://wg21.link/p0226r1
https://wg21.link/p0254r2
P0258R2 has_unique_object_representations VS 2017 15.3
P0272R1 Non-const basic_string::data() VS 2015.3
P0295R0 gcd(), lcm() VS 2017 15.3
P0298R3 std::byte VS 2017 15.3
P0302R1 Removing Allocator Support In std::function
VS 2017 15.5
P0307R2 Making Optional Greater Equal Again VS 2017 15.0
P0393R3 Making Variant Greater Equal VS 2017 15.0
P0403R1 UDLs For <string_view> ("meow"sv, etc.) VS 2017 15.3
P0414R2 shared_ptr<T[]>, shared_ptr<T[N]>
P0497R0 Fixing shared_ptr For Arrays
VS 2017 15.5
P0418R2 atomic compare_exchange memory_order
Requirements
VS 2017 15.3
P0426R1 constexpr For char_traits VS 2017 15.7
P0433R2 Integrating template deduction for class
templates into the standard library
P0739R0 Improving class template argument deduction
integration into the standard library
VS 2017 15.7
P0435R1 Overhauling common_type
P0548R1 Tweaking common_type and duration
VS 2017 15.3
P0504R0 Revisiting
in_place_t/in_place_type_t<T>/in_place_index_t<I>
VS 2017 15.0
P0505R0 constexpr For <chrono> (Again) VS 2017 15.3
P0510R0 Rejecting variants Of Nothing, Arrays,
References, And Incomplete Types
VS 2017 15.0
P0513R0 Poisoning hash
P0599R1 noexcept hash
VS 2017 15.3
P0516R0 Marking shared_future Copying As noexcept VS 2017 15.3
P0517R0 Constructing future_error From future_errc VS 2017 15.3
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
G
17
17, byte
17
17
14
14
14
17
14
14
14
https://wg21.link/p0258r2
https://wg21.link/p0272r1
https://wg21.link/p0295r0
https://wg21.link/p0298r3
https://wg21.link/p0302r1
https://wg21.link/p0307r2
https://wg21.link/p0393r3
https://wg21.link/p0403r1
https://wg21.link/p0414r2
https://wg21.link/p0497r0
https://wg21.link/p0418r2
https://wg21.link/p0426r1
https://wg21.link/p0433r2
https://wg21.link/p0739r0
https://wg21.link/p0435r1
https://wg21.link/p0548r1
https://wg21.link/p0504r0
https://wg21.link/p0505r0
https://wg21.link/p0510r0
https://wg21.link/p0513r0
https://wg21.link/p0599r1
https://wg21.link/p0516r0
https://wg21.link/p0517r0
P0521R0 Deprecating shared_ptr::unique() VS 2017 15.5
P0558R1 Resolving atomic<T> Named Base Class
Inconsistencies
VS 2017 15.3
P0595R2 std::is_constant_evaluated() VS 2019 16,5
P0602R4 Propagating Copy/Move Triviality In
variant/optional
VS 2017 15.3
P0604R0 Changing is_callable/result_of To
invoke_result, is_invocable, is_nothrow_invocable
VS 2017 15.3
P0607R0 Inline Variables for the Standard Library VS 2017 15.5
P0618R0 Deprecating <codecvt> VS 2017 15.5
P0682R1 Repairing Elementary String Conversions VS 2015 15.7
Recursos de biblioteca padrão do c++ 14Recursos de biblioteca padrão do c++ 14 Com supor teCom supor te
N3462 SFINAE-Friendly result_of VS 2015.2
N3302 constexpr For <complex> VS 2015
N3469 constexpr For <chrono> VS 2015
N3470 constexpr For <array> VS 2015
N3471 constexpr For <initializer_list>, <tuple>,
<utility>
VS 2015
N3545 integral_constant::operator()() VS 2015
N3642 UDLs For <chrono>, <string> (1729ms, "meow"s,
etc.)
VS 2015
N3644 Null Forward Iterators VS 2015
N3654 quoted() VS 2015
N3657 Heterogeneous Associative Lookup VS 2015
N3658 integer_sequence VS 2015
N3659 shared_mutex (Timed) VS 2015
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
17
14
20
17
17
17
17
17
https://wg21.link/p0521r0
https://wg21.link/p0558r1
https://wg21.link/P0595R2
https://wg21.link/P0602R4
https://wg21.link/p0604r0
https://wg21.link/p0607r0
https://wg21.link/p0618r0
https://wg21.link/P0682R1
https://wg21.link/n3462
https://wg21.link/n3302
https://wg21.link/n3469
https://wg21.link/n3470
https://wg21.link/n3471
https://wg21.link/n3545
https://wg21.link/n3642
https://wg21.link/n3644
https://wg21.link/n3654
https://wg21.link/n3657
https://wg21.link/n3658
https://wg21.link/n3659
N3668 exchange() VS 2015
N3669 Fixing constexpr Member Functions Without
const
VS 2015
N3670 get<T>() VS 2015
N3671 Dual-Range equal(), is_permutation(),
mismatch()
VS 2015
N3778 Sized Deallocation VS 2015
N3779 UDLs For <complex> (3.14i, etc.) VS 2015
N3789 constexpr For <functional> VS 2015
N3887 tuple_element_t VS 2015
N3891 Renaming shared_mutex (Timed) To
shared_timed_mutex
VS 2015
N3346 Minimal Container Element Requirements VS 2013
N3421 Transparent Operator Functors (less<>, etc.) VS 2013
N3655 Alias Templates For <type_traits> (decay_t,
etc.)
VS 2013
N3656 make_unique() VS 2013
REC URSOREC URSO C O M SUP O RT EC O M SUP O RT E
Valores com suporteValores com suporte
Um grupo de documentos listados em conjunto indica um recurso padrão junto com uma ou mais melhorias ou
expansões aprovadas. Esses recursos são implementados juntos.
NãoNão significa ainda não implementado.
ParcialParcial significa que a implementação está incompleta. Para obter mais informações, consulte a seção
observações.
VS 2010VS 2010 indica recursos com suporte no Visual Studio 2010.
VS 2013VS 2013 indica recursos com suporte no Visual Studio 2013.
VS 2015VS 2015 indica recursos com suporte no Visual Studio 2015 (RTW).
Vs 2015,2Vs 2015,2 e vs 2015,3vs 2015,3 indicam recursos com suporte no Visual Studio 2015 atualização 2 e no Visual Studio
2015 atualização 3, respectivamente.
VS 2017 15,0VS 2017 15,0 indica recursos com suporte no Visual Studio 2017 versão 15,0 (RTW).
VS 2017 15,3VS 2017 15,3 indica recursos com suporte no Visual Studio 2017 versão 15,3.
VS 2017 15,5VS 2017 15,5 indica recursos com suporte no Visual Studio 2017 versão 15,5.
VS 2017 15,7VS 2017 15,7 indica recursos com suporte no Visual Studio 2017 versão 15,7.
VS 2019 16,0VS 2019 16,0 indica recursos com suporte no Visual Studio 2019 versão 16,0 (RTW).
VS 2019 16,1VS 2019 16,1 indica recursos com suporte no Visual Studio 2019 versão 16,1.
https://wg21.link/n3668
https://wg21.link/n3669
https://wg21.link/n3670
https://wg21.link/n3671
https://wg21.link/n3778
https://wg21.link/n3779
https://wg21.link/n3789
https://wg21.link/n3887
https://wg21.link/n3891
https://wg21.link/n3346
https://wg21.link/n3421
https://wg21.link/n3655
https://wg21.link/n3656
ObservaçõesObservações
VS 2019 16,2VS 2019 16,2 indica recursos com suporte no Visual Studio 2019 versão 16,2.
VS 2019 16,3VS 2019 16,3 indica recursos com suporte no Visual Studio 2019 versão 16,3.
VS 2019 16,4VS 2019 16,4 indica recursos com suporte no Visual Studio 2019 versão 16,4.
VS 2019 16,5VS 2019 16,5 indica recursos com suporte no Visual Studio 2019 versão 16,5.
VS 2019 16,6VS 2019 16,6 indica recursos com suporte no Visual Studio 2019 versão 16,6.
VS 2019 16,7VS 2019 16,7 indica recursos com suporte no Visual Studio 2019 versão 16,7.
VS 2019 16,8VS 2019 16,8 indica recursos com suporte no Visual Studio 2019 versão 16,8.
RR no /std:c++14 modo, as especificações de exceção dinâmicas permanecem inimplementadas e throw()
ainda são tratadas como um sinônimo para __declspec(nothrow) . No C++ 17, as especificações de exceçãodinâmicas foram, na maioria, removidas pelo P0003R5, deixando um vestige: throw() é preterido e necessário
se comportar como um sinônimo para noexcept . No /std:c++17 modo, MSVC agora está em conformidade
com o padrão, dando throw() o mesmo comportamento que noexcept , ou seja, imposição por encerramento.
A opção do compilador /Zc:noexceptTypes solicita nosso comportamento antigo de __declspec(nothrow) . É
provável que o throw() seja removido no c++ 20. Para ajudar com a migração de código em resposta a essas
alterações no padrão e em nossa implementação, novos avisos do compilador para problemas de especificação
de exceção foram adicionados em /std:c++17 e /permissive- .
BB com suporte no /permissive- modo no Visual Studio 2017 versão 15,7. Para obter mais informações,
consulte o suporte à pesquisa de nome de duas fases é MSVC.
CC a partir do Visual Studio 2017 versão 15,8, o compilador fornece suporte para o pré-processador C99 por
meio da opção de compilador /experimental: pré-processador . A partir do Visual Studio 2019 versão 16,6, o
compilador implementa totalmente o pré-processador C99 por meio do /Zc:preprocessor comutador. Ele é
ativado por padrão quando a opção de compilador /std:c11 ou /std:c17 é especificada.
DD com suporte em /std:c++14 com um aviso de suppressible, C4984 .
EE essa é uma implementação totalmente nova, incompatível com a versão anterior std::experimental , tornada
necessária pelo suporte do symlink, correções de bugs e alterações no comportamento padrão requerido.
Atualmente, incluindo o <filesystem> fornece o novo std::filesystem e o anterior
std::experimental::filesystem , e incluindo <experimental/filesystem> o fornece apenas a implementação
experimental antiga. A implementação experimental será REMOVIDA na próxima versão ABI recente das
bibliotecas.
GG Compatível com um compilador intrínseco.
1414 esses recursos do c++ 17/20 estão sempre habilitados, mesmo quando /std:c++14 (o padrão) é
especificado. O motivo é porque o recurso foi implementado antes da introdução das opções de /std/std ou porque
a implementação condicional era indesejávelmente complexa.
1717 esses recursos são habilitados pela /std:c++17 opção de /std:c++latest compilador (ou).
2020 esses recursos são habilitados pela /std:c++latest opção do compilador. Quando a implementação do C++
20 for concluída, uma nova /std:c++20 opção de compilador será adicionada, sob a qual esses recursos
também estarão disponíveis.
Recuperação de desastreRecuperação de desastre Esses recursos estão habilitados em todos os /std modos de opção de compilador.
O Comitê standard do C++ adotou isso como um relatório de defeito retroativa para C++ 11 e todas as versões
posteriores.
bytebyte std::byte é habilitado pelo /std:c++17 (ou /std:c++latest ), mas como pode entrar em conflito com os
cabeçalhos de SDK do Windows em alguns casos, ele tem uma macro de aceitação refinada. Ele pode ser
desabilitado, definindo _HAS_STD_BYTE como 0 .
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/zc-noexcepttypes
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://docs.microsoft.com/pt-br/cpp/build/reference/permissive-standards-conformance
https://devblogs.microsoft.com/cppblog/two-phase-name-lookup-support-comes-to-msvc/
https://docs.microsoft.com/pt-br/cpp/build/reference/experimental-preprocessor
https://docs.microsoft.com/pt-br/cpp/build/reference/zc-conformance
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/error-messages/compiler-warnings/compiler-warning-c4984
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
C11C11 O suporte do compilador para C11 requer o Visual Studio versão 16,8 ou superior. O suporte à biblioteca
C11 requer SDK do Windows versão 20211 ou superior. O CRT universal implementa as partes da biblioteca de
C11 padrão que são exigidas pelo C++ 17, com exceção dos strftime() especificadores de conversão
alternativa e/s de C99 e C11 aligned_alloc() . É improvável que o último seja implementado porque o sistema
operacional Windows não dá suporte a alocações alinhadas.
REMREM Recursos removidos quando a /std:c++17 opção de /std:c++latest compilador (ou) é especificada. Esses
recursos podem ser habilitados novamente de modo a facilitar a transição para os modos de idioma mais
recentes pelo uso destas macros: _HAS_AUTO_PTR_ETC , _HAS_FUNCTION_ALLOCATOR_SUPPORT ,
_HAS_OLD_IOSTREAMS_MEMBERS e _HAS_UNEXPECTED .
charconvcharconv from_chars() e to_chars() estão disponíveis para números inteiros. A linha do tempo para o ponto
flutuante from_chars() e ponto flutuante to_chars() é da seguinte maneira:
VS 2017 15,7: inteiro from_chars() e to_chars() .
VS 2017 15,8: ponto flutuante from_chars() .
VS 2017 15,9: to_chars() sobrecargas de ponto flutuante para decimal mais curto.
VS 2019 16,0: to_chars() sobrecargas de ponto flutuante para hexadecimal hexadecimal e precisão mais
curto.
VS 2019 16,2: to_chars() sobrecargas de ponto flutuante para precisão fixa e precisão científica.
VS 2019 16,4: a sobrecarga de ponto flutuante to_chars() para precisão geral.
paraleloparalelo A biblioteca de algoritmos paralelos do c++ 17 está concluída. Concluir não significa que todos os
algoritmos são paralelizados em todos os casos. Os algoritmos mais importantes foram paralelizados e as
assinaturas de política de execução são fornecidas até mesmo onde os algoritmos não são paralelizados. O
cabeçalho interno central de nossa implementação, yvals_core. h, contém as seguintes "notas de algoritmos
paralelos": o C++ permite uma implementação para implementar algoritmos paralelos como chamadas para os
algoritmos de série. Essa implementação paraleliza várias chamadas de algoritmo comum, mas não todas.
Os seguintes algoritmos são paralelizados:
adjacent_difference , adjacent_find , all_of , any_of , count , count_if , equal , exclusive_scan , find ,
find_end , find_first_of , find_if , find_if_not , for_each , for_each_n , inclusive_scan , is_heap ,
is_heap_until , is_partitioned , is_sorted , is_sorted_until , mismatch , none_of , partition , reduce ,
remove , remove_if , replace , replace_if , search , search_n , set_difference , set_intersection , sort ,
stable_sort , transform , transform_exclusive_scan , transform_inclusive_scan , transform_reduce
Os itens a seguir não estão atualmente paralelizados:
Melhoria de desempenho perceptível de paralelismo no hardware de destino; todos os algoritmos que
meramente copiam ou permutam elementos sem ramificaçõesnormalmente são limitados à largura de
banda de memória:
Há confusão sobre requisitos de paralelismo de usuário. Provavelmente na categoria acima mesmo assim:
Paralelismo efetivo com suspeita de não ser viável:
Ainda não avaliado; o paralelismo pode ser implementado em uma versão futura e acredita-se que seja
benéfico:
copy , copy_n , fill , fill_n , move , reverse , reverse_copy , rotate , rotate_copy , shift_left ,
shift_right , swap_ranges
generate , generate_n
partial_sort , partial_sort_copy
copy_if , includes , inplace_merge , lexicographical_compare , max_element , merge , min_element ,
minmax_element , nth_element , partition_copy , remove_copy , remove_copy_if , replace_copy ,
replace_copy_if , set_symmetric_difference , set_union , stable_partition , unique , unique_copy
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
Confira também
Referência da linguagem C++
Biblioteca padrão do C++
Melhorias de conformidade do C++ no Visual Studio
O que há de novo para Visual C++ no Visual Studio
Visual C++ histórico de alteração 2003 a 2015
Visual C++ as novidades de 2003 a 2015
Blog da equipe do C++
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-change-history-2003-2015
https://docs.microsoft.com/pt-br/cpp/porting/visual-cpp-what-s-new-2003-through-2015
https://devblogs.microsoft.com/cppblog/
Plataformas com suporte (Visual C++)
15/04/2020 • 4 minutes to read • Edit Online
SIST EM ASIST EM A
O P ERA C IO N A LO P ERA C IO N A L X86X86 X64X64 A RMA RM A RM 64****A RM 64****
Windows XP X* X*
Windows Server 2003 X* X*
Windows Vista X X
Windows Server 2008 X X
Windows 7 X X
Windows Server 2012
R2
X X
Windows 8 X X X
Windows 8.1 X X X
Windows 10 X X X X
Android ** X X X X
iOS ** X X X X
Linux *** X X X X
Os aplicativos criados com o Visual Studio podem ser direcionados a várias plataformas, como as seguintes.
*Você pode usar o conjunto de ferramentas da plataforma Windows XP incluído no Visual Studio 2017, Visual
Studio 2015, Visual Studio 2013 e Visual Studio 2012 Update 1 para construir projetos do Windows XP e Windows
Server 2003. Para obter informações sobre como usar esse conjunto de ferramentas da plataforma, consulte
Configuring Programs for Windows XP (Configurando programas para Windows XP). Para obter mais informações
sobre como alterar o conjunto de ferramentas da plataforma, consulte Como modificar a estrutura de destino e o
conjunto de ferramentas da plataforma.
** É possível instalar a carga de trabalho Desenvolvimento Móvel com C++Desenvolvimento Móvel com C++ no instalador do Visual Studio
2017 e posterior. Na instalação do Visual Studio 2015, escolha o componente opcional Visual C++ paraVisual C++ para
Desenvolvimento Móvel da Plataforma CruzadaDesenvolvimento Móvel da Plataforma Cruzada para direcionar plataformas iOS ou Android. Para obter
mais informações, consulte Instalar o Visual C++ para Desenvolvimento Móvel da Plataforma Cruzada. Para
compilar o código do iOS, é necessário ter um computador Mac e atender a outros requisitos. Para obter uma lista
de pré-requisitos e instruções de instalação, consulte Instalar e configurar ferramentas de build usando o iOS. É
possível compilar código x86 ou ARM para coincidir com o hardware de destino. Use configurações x86 para
compilar no simulador de iOS, no Emulador do Microsoft Visual Studio para Android e em alguns dispositivos
Android. Use configurações ARM para compilar em dispositivos iOS e na maioria dos dispositivos Android.
*** É possível instalar a carga de trabalho Desenvolvimento para L inux com C++Desenvolvimento para L inux com C++ no instalador do Visual
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/supported-platforms-visual-cpp.md
https://docs.microsoft.com/pt-br/cpp/build/configuring-programs-for-windows-xp
https://docs.microsoft.com/pt-br/cpp/build/how-to-modify-the-target-framework-and-platform-toolset
https://docs.microsoft.com/pt-br/visualstudio/cross-platform/install-visual-cpp-for-cross-platform-mobile-development
https://docs.microsoft.com/pt-br/visualstudio/cross-platform/install-and-configure-tools-to-build-using-ios
Confira também
Studio 2017 e posterior para direcionar plataformas Linux. Para obter instruções, consulte Baixar, instalar e
configurar a carga de trabalho do Linux. Esse conjunto de ferramentas compila o executável no computador de
destino, permitindo builds para qualquer arquitetura com suporte.
**** O suporte a ARM64 está disponível no Visual Studio 2017 e posterior.
Para obter informações de como definir a configuração da plataforma de destino, consulte Baixar, instalar e
configurar a carga de trabalho do Linux (Como configurar projetos do Visual C++ para plataformas x64 de 64 bits
de destino).
Ferramentas e recursos do Visual C++ em edições do Visual Studio
Introdução
https://docs.microsoft.com/pt-br/cpp/linux/download-install-and-setup-the-linux-development-workload
https://docs.microsoft.com/pt-br/cpp/build/how-to-configure-visual-cpp-projects-to-target-64-bit-platforms
https://docs.microsoft.com/pt-br/visualstudio/ide/getting-started-with-cpp-in-visual-studio
Ferramentas e funcionalidades do C++ em edições
do Visual Studio
02/11/2020 • 19 minutes to read • Edit Online
Plataformas
Compiladores
Cargas de trabalho do C++
Desenvolvimento para desktop com C++Desenvolvimento para desktop com C++
Os recursos do C++ a seguir estão disponíveis no Visual Studio 2019. A menos que declarado de outra forma,
todos os recursos estão disponíveis em todas as edições: Visual Studio Community, Visual Studio Professional e
Visual Studio Enterprise. Alguns recursos exigem cargas de trabalho específicas ou componentes opcionais, que
você pode instalar com o Instalador do Visual Studio.
Windows Desktop
Plataforma Universal do Windows ((tablet, computador, Xbox, IoT e HoloLens))
Linux
Android
iOS
Compilador MSVC de 32 bits para x86, x64, ARM e ARM64
Compilador MSVC de 64 bits para x86, x64, ARM e ARM64
Compilador cruzado GCC para ARM
Clang/LLVM
No Windows, Clang/LLVM 7.0, direcionando x86 ou x64 (somente suporte a CMake). Outras versões do
Clang poderiam funcionar, mas não há suporte oficial para elas.
No Linux, há suporte a qualquer instalação do Clang/LLVM pela distribuição.
O Visual Studio inclui as seguintes cargas de trabalho para desenvolvimento do C++. É possível instalar qualquer
uma ou todas elas juntamente com outras cargas de trabalho como Desenvolvimento para Desktop do .NET,
Desenvolvimento do Python, Desenvolvimento do Azure, Desenvolvimento de Extensão do Visual Studio e outros.
Incluído:
Principais recursos de área de trabalho do C++
Componentes opcionais:
MSVC v142 – ferramentas de build do C++ para VS 2019 x64/x86 (v14.21)
SDK do Windows 10 (10.0.17763.0)
Depurador Just-In-Time
Ferramentas de criação de perfil do C++
Ferramentas CMake do C++ para Windows
ATL do C++ para ferramentas de build v142 (x86 e x64)
Adaptador de Teste para Boost.Test
Adaptador de Teste para Google Test
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/visual-cpp-tools-and-features-in-visual-studio-editions.md
Desenvolvimento de Linux com C++Desenvolvimento de Linux com C++
Desenvolvimento para a Plataforma Universal do WindowsDesenvolvimento para a Plataforma Universal do Windows
Desenvolvimento de jogos do C++Desenvolvimento de jogos do C++
Live Share
IntelliCode
IntelliTrace (somente Enterprise)
MFC do C++ para ferramentas de build v142 (x86 e x64)
Suporte do C++/CLI para ferramentas de build v142 (14.21)
Módulos do C++ para ferramentas de build v142 (x64/x86 – experimental)
Compilador do Clang para Windows
IncrediBuild - Aceleração de Build
SDK do Windows 10 (10.0.17134.0)
SDK do Windows 10 (10.0.16299.0)
MSVC v141 – ferramentas de build do C++ para VS 2017 x64/x86 (v14.16)
MSVC v140 – ferramentas de build do C++para VS 2015 (v14.00)
Incluído:
Funcionalidades principais do C++
Runtime C Universal do Windows
Desenvolvimento do C++ para Linux
Componentes opcionais:
Ferramentas CMake do C++ para Linux
Ferramentas de desenvolvimento inseridas e de IoT
Incluído:
Blend for Visual Studio
.NET Native e .NET Standard
Gerenciador de pacotes NuGet
Ferramentas da Plataforma Universal do Windows
SDK do Windows 10 (10.0.17763.0)
Componentes opcionais:
IntelliCode
IntelliTrace (somente Enterprise)
Conectividade de dispositivos USB
Ferramentas da Plataforma Universal do Windows do C++ (v142)
Ferramentas da Plataforma Universal do Windows do C++ (v141)
Depurador de gráficos e criador de perfil de GPU do DirectX
SDK do Windows 10 (10.0.18362.0)
SDK do Windows 10 (10.0.17134.0)
SDK do Windows 10 (10.0.16299.0)
Ferramentas de arquitetura e análise
Incluído:
Funcionalidades principais do C++
Runtime C Universal do Windows
Desenvolvimento móvel com C++Desenvolvimento móvel com C++
Componentes individuais
Bibliotecas e cabeçalhos
Atualização dos Pacotes Redistribuíveis do C++ 2019
MSVC v142 – ferramentas de build do C++ para VS 2019 x64/x86 (v14.21)
Componentes opcionais:
Ferramentas de criação de perfil do C++
SDK do Windows 10 (10.0.17763.0)
IntelliCode
IntelliTrace (somente Enterprise)
SDK do Windows 10 (10.0.17134.0)
SDK do Windows 10 (10.0.16299.0)
IncrediBuild - Aceleração de Build
Cocos
Instalador do Unreal Engine
Suporte do IDE do Android para Unreal Engine
Incluído:
Funcionalidades principais do C++
Instalação do SDK do Android (nível da API 25) (instalação local para Desenvolvimento Móvel com C++)
Componentes opcionais:
NDK do Android (R16B)
Apache Ant (1.9.3)
Ferramentas de desenvolvimento do Android para C++
IntelliCode
Google Android Emulator (Nível da API 25) (instalação local)
Intel HAXM (Hardware Accelerated Execution Manager) (instalação local)
NDK do Android (R16B) (32 bits)
Ferramentas de desenvolvimento do iOS para C++
IncrediBuild - Aceleração de Build
É possível instalar esses componentes independentemente de qualquer carga de trabalho.
Diagnóstico do JavaScript
Live Share
runtime da Plataforma Universal do Windows do C++ para ferramentas de build v142
Publicação ClickOnce
Projetos do Instalador do Microsoft Visual Studio
Cabeçalhos e bibliotecas do Windows
CRT (Runtime C) Universal do Windows
Biblioteca Padrão C++
ATL
MFC
Biblioteca de classes .NET Framework
Sistemas de build e de projeto
Modelos de projeto
Biblioteca de suporte do C++ para .NET
OpenMP 2.0
Mais de 900 bibliotecas open-source por meio do catálogo de vcpkg
CMake
Qualquer sistema de build por meio de Abrir Pasta
Builds de linha de comando (msbuild.exe)
Multiplataforma nativa
Multiplataforma gerenciada
Builds paralelos
Personalizações de build
Extensibilidade de páginas de propriedades
Os seguintes modelos de projeto estão disponíveis dependendo de quais cargas de trabalho você instalou.
Área de trabalho do Windows:
Projeto em branco
Aplicativo de Console
Assistente de Área de Trabalho do Windows
Aplicativos da Área de Trabalho do Windows
Projeto Itens Compartilhados
Aplicativo do MFC
Biblioteca de vínculo dinâmico
Projeto CLR Vazio
Aplicativo de console do CLR
Biblioteca Estática
Projeto do CMake
Projeto ATL
Biblioteca de vínculo dinâmico do MFC
Biblioteca de classes do CLR
Projeto Makefile (Windows)
ActiveXControl do MFC
Projeto de Teste da Unidade Nativa
Google Test
Plataforma Universal do Windows (C++/CX):
Aplicativo em branco
Aplicativo DirectX 11 e XAML
Aplicativo DirectX 11
Aplicativo DirectX 12
Aplicativo de Teste de Unidade
DLL
componente do Windows Runtime
Biblioteca Estática
Ferramentas
Funcionalidades de depuração
Designers e Editores
Projeto de Empacotamento de Aplicativo do Windows
Linux:
Aplicativo de console (Linux)
Projeto vazio (Linux)
Raspberry Pi Blink
Projeto Makefile (Linux)
Vinculador Incremental (Link.exe)
Utilitário do Microsoft Makefile (Nmake.exe)
Gerador de Lib (Lib.exe)
Compilador de Recurso do Windows (Rc.exe)
Recurso do Windows para Conversor de Objeto (CvtRes.exe)
Utilitário de Manutenção de Informações de Procura (BscMake.exe)
Removedor de Decoração de Nomes do C++ (Undname.exe)
Despejo de COFF/PE (Dumpbin.exe)
Editor de COFF/PE (Editbin.exe)
MASM (Ml.exe)
Spy++
ErrLook
AtlTrace
Regras de inferência
Otimizações guiadas por perfil
Depuração nativa
natvis (visualização nativa de tipo)
Depuração de gráficos
Depuração gerenciada
Uso de GPU
Uso de memória
Depuração remota
Depuração SQL
Análise de código estático
XAML Designer
Designer/Editor de Estilo CSS
Designer/Editor de HTML
Editor de XML
Editor de Código-fonte
Recursos de produtividade: refatoração, mecanismo IntelliSense EDG, formatação de código C++
Designer de Formulários do Windows
Designer de dados
Funcionalidades de dados
Automação e extensibilidade
Ferramentas de gerenciamento de ciclo de vida do aplicativo
Veja também
Editor de Recurso Nativo (arquivos .rc)
Editores de recursos
Editor de modelos
Designer de sombreador
Validação de dependência dinâmica (somente Enterprise)
Diagramas de camada de arquitetura (somente Enterprise)
Validação de arquitetura (somente Enterprise)
Clone de código (somente Enterprise)
Designer de dados
Objetos de dados
Serviços Web
Gerenciador de Servidores
Modelos de objeto de extensibilidade
Modelo de código
Modelo de Projeto
Modelo de editor de recursos
Modelo de assistente
Modelo de objeto do depurador
Teste de Unidade (Microsoft Native C++, Boost.Test, Google Test, CTest)
Mapa de códigos e grafos de dependência (Professional e Enterprise)
Cobertura de código (somente Enterprise)
Teste manual (somente Enterprise)
Teste exploratório (somente Enterprise)
Gerenciamento de caso de teste (somente Enterprise)
Integração de depurador do mapa de códigos (somente Enterprise)
Live Unit Testing (somente Enterprise)
IntelliTrace (somente Enterprise)
IntelliTest (somente Enterprise)
Microsoft Fakes (Isolamento de teste de unidade) (somente Enterprise)
Cobertura de código (somente Enterprise)
Instalar o Visual Studio
O que há de novo no Visual Studio
Tipos de projeto do C++ no Visual Studio
As tabelas a seguir mostram os recursos do Visual C++ disponíveis no Visual Studio 2017. Um X em uma célula
indica que o recurso está disponível; uma célula vazia indica que o recurso não está disponível. As observações
entre parênteses indicam que um recurso está disponível, mas é restrito.
https://docs.microsoft.com/pt-br/visualstudio/install/install-visual-studio
https://docs.microsoft.com/pt-br/visualstudio/ide/whats-new-in-visual-studio
https://docs.microsoft.com/pt-br/cpp/build/reference/visual-cpp-project-types
Plataformas
P L ATA F O RM AP L ATA F O RM A
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S 10W IN DO W S 10
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
C O M M UN IT Y / P RO F ESC O M M UN IT Y / P RO F ES
SIO N A LSIO N A L
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Windows Desktop X X X
Plataforma Universal
do Windows
(telefone, tablet,
computador, Xbox,
IoT e HoloLens)
X X X
Linux X X
Microsoft Store 8.1 X X
Windows Phone 8.0 X X
Android X X
iOS X X
Compiladores
C O M P IL A DO RC O M P IL A DO R
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Compilador MSVC
X86 de 32 bits
X X X X
Compilador cruzado
X86_arm
X X X
Compilador MSVC
x64 de 64 bits
X X
Compilador cruzado
X86_ x64
X X X X
Bibliotecas e cabeçalhos
B IB L IOT EC A O UB IB L IOT EC A O U
C A B EÇ A L H OC A B EÇA L H O
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Cabeçalhos e
bibliotecas do
Windows e biblioteca
CRT
(X) X X X
Biblioteca Padrão
C++
X X X X
ATL X X
MFC X X
Biblioteca de classes
.NET Framework
X X X
Biblioteca de suporte
do C++ para .NET
X X X
OpenMP 2.0 X X X X
B IB L IOT EC A O UB IB L IOT EC A O U
C A B EÇ A L H OC A B EÇ A L H O
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Modelos de projeto
M O DELOM O DELO
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Modelos XAML para
UWP, Windows 8.1,
Windows Phone 8.0
X X X
Aplicativo Direct3D X X X
DLL (Universal do
Windows)
X X X
Biblioteca Estática
(Universal do
Windows)
X X X
componente do
Windows Runtime
X X X
Aplicativo de Teste de
Unidade (Universal
do Windows)
X X X
Projeto ATL X X
Biblioteca de Classes
(CLR)
X X X
Aplicativo de Console
CLR
X X X
Projeto CLR Vazio X X X
Assistente
personalizado
X X
Projeto em branco X X X
Projeto Makefile X X X
Controle ActiveX do
MFC
X X
Aplicativo MFC X X
DLL do MFC X X
Projeto de Teste X X X X
Aplicativo de Console
Win32
X X X
Projeto Win32 X X X
M O DELOM O DELO
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Ferramentas
F ERRA M EN TAF ERRA M EN TA
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Vinculador
Incremental (Link.exe)
X X X X
Utilitário de
Manutenção de
Programas
(Nmake.exe)
X X X
Gerador de Lib
(Lib.exe)
X X X X
Compilador de
Recurso do Windows
(Rc.exe)
X X X X
Recurso do Windows
para Conversor de
Objeto (CvtRes.exe)
X X X
Utilitário de
Manutenção de
Informações de
Procura
(BscMake.exe)
X X X X
Removedor de
Decoração de Nomes
do C++
(Undname.exe)
X X X X
Despejo de COFF/PE
(Dumpbin.exe)
X X X X
Editor de COFF/PE
(Editbin.exe)
X X X X
MASM (Ml.exe) X X
Spy++ X X
ErrLook X X
AtlTrace X X
Devenv.com X X
Regras de inferência X X
Atualizar projetos
.vcproj do VCBuild
para o MSBuild
(VCUpgrade.exe)
X X X X
Otimizações guiadas
por perfil
X X
F ERRA M EN TAF ERRA M EN TA
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Funcionalidades de depuração
REC URSO DEREC URSO DE
DEP URA Ç Ã ODEP URA Ç Ã O
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Depuração nativa X X X X
natvis (visualização
nativa de tipo)
X X X X
Depuração de
gráficos
X X X
Depuração
gerenciada
X X X
Uso de GPU X X X
Uso de memória X X X
Depuração remota X X X X
Depuração SQL X X
Análise de código
estático
Limitado Limitado X X
REC URSO DEREC URSO DE
DEP URA Ç Ã ODEP URA Ç Ã O
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Designers e Editores
DESIGN ER O U EDITO RDESIGN ER O U EDITO R
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
XAML Designer X X X
Designer/Editor de
Estilo CSS
X X X X
Designer/Editor de
HTML
X X X X
Editor de XML X X X X
Editor de Código-
fonte
X X X X
Funcionalidades de
produtividade:
Refatoração,
IntelliSense,
Formatação de
Código C++
X X X X
Designer de
Formulários do
Windows
X X X
Designer de dados X X
Editor de Recurso
Nativo (arquivos .rc)
X X
Editores de recursos X X X X
Editor de modelos X X X
Designer de
sombreador
X X X
Funcionalidades de dados
REC URSO DE DA DO SREC URSO DE DA DO S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Designer de dados X X
Objetos de dados X X
Serviços Web X X
Gerenciador de
Servidores
X X
Sistemas de build e de projeto
REC URSO DE B UIL DREC URSO DE B UIL D
O U DE P RO JETOO U DE P RO JETO
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Builds de linha de
comando
(msbuild.exe)
X X X X
Multiplataforma
nativa
X X X
Multiplataforma
gerenciada
X X X
Builds paralelos X X X X
Personalizações de
build
X X X X
Extensibilidade de
páginas de
propriedades
X X X X
Automação e extensibilidade
A UTO M A Ç Ã O EA UTO M A Ç Ã O E
EXT EN SIB IL IDA DEEXT EN SIB IL IDA DE
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Modelos de objeto de
extensibilidade
X X
Modelo de código X X
Modelo de Projeto X X
Modelo de editor de
recursos
X X
Modelo de assistente X X
Modelo de objeto do
depurador
X X
A UTO M A Ç Ã O EA UTO M A Ç Ã O E
EXT EN SIB IL IDA DEEXT EN SIB IL IDA DE
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA LST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Ferramentas de gerenciamento de ciclo de vida do aplicativo
F ERRA M EN TAF ERRA M EN TA
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W SW IN DO W S
VISUA L ST UDIOVISUA L ST UDIO
EXP RESS PA RAEXP RESS PA RA
W IN DO W S DESKTO PW IN DO W S DESKTO P
VISUA L ST UDIOVISUA L ST UDIO
P RO F ESSIO N A L / C O MP RO F ESSIO N A L / C O M
M UN IT YM UN IT Y
VISUA L ST UDIOVISUA L ST UDIO
EN T ERP RISEEN T ERP RISE
Teste de unidade
(estrutura nativa)
X X X X
Teste de unidade
(estrutura gerenciada)
X X X
Cobertura de código X
Teste manual X
Teste exploratório X
Gerenciamento de
casos de teste
X
Mapa de códigos e
grafos de
dependência
somente leitura X
Depuração do mapa
de códigos
X
Veja também
Instalar o Visual Studio
O que há de novo no Visual Studio
Tipos de projeto do C++ no Visual Studio
https://docs.microsoft.com/pt-br/visualstudio/install/install-visual-studio
https://docs.microsoft.com/pt-br/visualstudio/ide/whats-new-in-visual-studio
https://docs.microsoft.com/pt-br/cpp/build/reference/visual-cpp-project-types
Instalar o suporte C11 e C17 no Visual Studio
02/11/2020 • 9 minutes to read • Edit Online
Pré-requisitos
Etapa 1: entrar usando uma conta do Microsoft Insider
Etapa 2: baixar o SDK do Windows 10 do insider Preview
O suporte para os padrões C11 e C17 requer o Visual Studio 2019 versão 16,8 ou posterior. Para ver a
documentação desta versão, defina o controle do seletor de versãoversão do Visual Studio para este artigo como Visual
Studio 2019. Ele é encontrado na parte superior do Sumário nesta página.
O suporte para os padrões C11 e C17 está disponível a partir do Visual Studio 2019 versão 16,8. O suporte requer
um UCRT (tempo de execução universal C) atualizado e as últimas atualizações de SDK do Windows, para funcionar
corretamente com o pré-processador () em conformidade /Zc:preprocessor .
As versões SDK do Windows correspondem às versões do sistema operacional Windows. Como não houve uma
versão do Windows com essas alterações, você precisará de uma SDK do Windows Insider Preview . Essa é uma
versão de visualização do SDK do Windows que corresponde ao Windows Builds que estão sendo comprovados no
momento, ou testados, por parte dos integrantes do Windows. Depois de instalar o SDK do Windows 10 do insider
Preview, os projetos do Visual Studio configurados para usar o SDK do Windows mais recente usarão o Insider
Preview.
Visual Studio 2019 versão 16,8 Preview 3 ou posterior instalado e em execução no seu computador. Na
instalação, inclua o desenvolvimento de desktop com carga de trabalho do C++. Você pode baixar a versão
prévia mais recente na página de visualização do Visual Studio . Se o Visual Studio ainda não estiver instalado,
consulte Instalar suporte a C++ no Visual Studio para obter instruções de instalação.
Qualquer pessoa pode criar um conta Microsoft gratuito e, em seguida, optar pelo programa Insider. Acesse a
página do programa Windows Insider para desenvolvedores , escolha registrarregistrar e entre.
Depois de se registrar, você terá uma opção para iniciar o Flighting Insider versões do Windows. Essa etapa não é
necessária para baixar e usar o SDK do Windows 10 do insider. Quando você se registra no Windows Insider, ele
não aceita automaticamente que seus computadores baixem novos vôos do Windows.
Quando chegar à página Bem-vindo ao programa Windows InsiderBem-vindo ao programa Windows Insider , você não precisará escolher voo agoravoo agora .
Continue na próxima etapa para baixar o SDK do Windows 10 do insider Preview.
Você pode instalar o SDK do Windows do insider Preview na página de downloads do Windows Insider Preview .
Se você vir uma mensagem dizendo "você precisa ser um membro do programa Windows Insider", verifique se
você entrou. Use o mesmo conta Microsoft usado para o programa Insider. Se você vir uma mensagem dizendo
"Lamentamos, a página solicitada não pode ser encontrada", tente alterar a localidade na URL para en-US .
A página Insider Claims que usa um sistema operacional Windows 10 Insider Preview é necessária. Ele só é válido
para alguns dos conteúdos incluídos na SDK do Windows. Esse conteúdo pode depender de novas APIs que não
estão presentes em versões anteriores do Windows. No entanto, os cabeçalhos de tempo de execução do Windows
e do universal C podem ser instalados e utilizáveis sem um sistema operacional Insider.
Escolha obter SDK Insider Preview – compilação 20211obter SDK Insider Preview – compilação 20211 (ou posterior) para iniciar o download. As versões
posteriores do SDK do Windows também funcionarão.
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/install-c17-support.md
https://docs.microsoft.com/pt-br/cpp/build/reference/zc-preprocessor
https://visualstudio.microsoft.com/vs/preview/
https://signup.live.com/
https://insider.windows.com/for-developers
https://www.microsoft.com/software-download/windowsinsiderpreviewSDK
Etapa 3: instalar o SDK do Windows 10 do insider Preview
Etapa 4: Configurando o modo C11 ou C17 no Visual Studio
O Insider Preview SDK do Windows é baixado como um .iso arquivo. Abra a pasta que contém o arquivo baixado
no explorador de arquivos. Monte o .iso arquivo e execute WinSDKSetup.exe para iniciar a instalação.
Na página especificar localespecificar local , selecione instalar o kit de desenvolvimento de software do Windows –instalar o kit de desenvolvimento de software do Windows –
<version> para este computador<version> para este computador e, em seguida, escolha AvançarAvançar . Na página de pr ivacidade dos kits doprivacidade dos kits do
WindowsWindows , selecione se deseja permitir que a Microsoft colete informações para os kits do Windows 10 e escolha
AvançarAvançar . Escolha aceitaraceitar para aceitar o contrato de licença. Na página selecionar os recursos que vocêselecionar os recursos que você
deseja instalardeseja instalar , selecione apenas estes recursos:
Ferramentas de assinatura SDK do Windows para aplicativos da área de trabalho
SDK do Windows para aplicativos gerenciados por UWP
SDK do Windows para aplicativos UWP C++
SDK do Windows para aplicativos desktop C++ x86 (se você planeja Compilar para x86)
SDK do Windows para aplicativos do Desktop C++ amd64 (se você planeja Compilar para AMD64)
SDK do Windows para aplicativos de ARM de Desktop C++ (se você planeja Compilar para ARM)
SDK do Windows para aplicativos desktop C++ arm64 (se você planeja Compilar para arm64)
Escolha instalarinstalar para instalar os componentes do SDK selecionados. O SDK leva alguns minutos para concluir a
instalação. Ao concluir, abra o Visual Studio.
No Visual Studio, abra um projeto C novo ou existente e, em seguida, abra a caixa de diálogo páginas depáginas de
propriedadespropriedades do projeto.
Veja também
Defina o projeto para usar o SDK de visualização do Windows 10 para os lados. Na página Propriedades dePropriedades de
configuraçãoconfiguração > geralgeral , defina a propriedade SDK do Windows versãoSDK do Windows versão como 10,0 (versão mais recente10,0 (versão mais recente
instalada)instalada) ou para a versão de visualização específica que você instalou.
Você também verá uma nova opção: C Language StandardC Language Standard . Defina essa propriedade como ISO C11 StandardISO C11 Standard
( ( /std:c11 ) ) ou ISO C17 (2018) Standard ( ISO C17 (2018) Standard ( /std:c17 ) ) .
O padrão de linguagem C++ é usado quando o idioma é C++. É o padrão quando a extensão de arquivo é .cpp .
A versão padrão da linguagem C é usada quando o idioma é C. É o padrão quando a extensão de arquivo é .c .
Para criar usando C11 ou C17, coloque o código-fonte em um .c arquivo ou defina o código para compilar como
C. Você pode definir essa propriedade para seu projeto na página de Propriedades de configuraçãoPropriedades de configuração> C/C++C/C++ >
AdvancedAdvanced . Defina a propriedade compile ascompile as para Compilar como código C (/TC)Compilar como código C (/TC) .
Parabéns, você configurou tudo o que precisa para criar o C11 e o código C17 no Visual Studio 2019 versão 16,8
Preview 3!
/std (Especifique a versão padrão do idioma)
https://docs.microsoft.com/pt-br/cpp/build/reference/std-specify-language-standard-version
Amostras do Visual Studio C++
02/11/2020 • 106 minutes to read • Edit Online
Exemplos de C++ arquivados no GitHub
IMPORTANTIMPORTANT
Exemplos de ATL
Exemplos de ATL-avançadoExemplos de ATL-avançado
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
ActiveDoc Demonstra como implementar um servidor de documentos
ativo.
Async Baixa dados de forma assíncrona de uma URL.
ATLButton Cria um botão que exibe a si mesmo com três bitmaps
diferentes, dependendo de seu estado.
ATLDuck Demonstra o uso de pontos de conexão com controles ATL.
ATLSecurity Mostra como usar as classes de segurança do ATL para
examinar as configurações de segurança.
Exemplos para o Visual Studio C++ estão disponíveis na Web. A Microsoft produziu muitos exemplos de C++ que
demonstram funcionalidades diferentes em várias tecnologias. Aqui estão alguns dos locais para encontrar
exemplos adicionais:
Exemplos de Microsoft Docs-C++
Exemplos do Windows no GitHub
Exemplos de código do centro de desenvolvimento do Windows
Arquivo de exemplo do CodePlex
Exemplos de código do ADO
Exemplos de desenvolvimento de hardware para Windows
O Visual Studio incluiu o código de exemplo C++ em versões anteriores. O código de exemplo foi instalado com o
Visual Studio ou estava disponível como um download separado. Muitos artigos em nossa documentação
referem-se a esses exemplos. Eles não são mais instalados pelo Visual Studio. Em vez disso, um repositório está
disponível no GitHub. As tabelas a seguir têm descrições para cada exemplo e links para o diretório do exemplo no
repositório.
Este código de exemplo destina-se a ilustrar um conceito e mostra somente o código que é relevante para esse conceito. Ele
pode não atender aos requisitos de segurança de um ambiente específico e não deve ser usado exatamente como mostrado.
Recomendamos que você adicione código de segurança e tratamento de erros para tornar seus projetos tão seguros e
robustos quanto for conveniente. A Microsoft fornece esse código de exemplo "como está", sem garantias.
https://github.com/MicrosoftDocs/cpp-docs.pt-br/blob/live/docs/overview/visual-cpp-samples.md
https://docs.microsoft.com/pt-br/samples/browse/?term=c%2b%2b
https://microsoft.github.io/windows/
https://developer.microsoft.com/windows/samples
https://archive.codeplex.com/
https://docs.microsoft.com/pt-br/office/client-developer/access/desktop-database-reference/ado-code-examples-in-microsoft-visual-c
https://docs.microsoft.com/pt-br/samples/browse/?products=windows-wdk
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
ATLTraceTool Exibe a saída gerada pela ATLTRACE2 macro.
Connect Ilustra a implementação e o uso de pontos de conexão (as
interfaces IConnectionPointContainer e IConnectionPoint) em
um ambiente multi-threaded.
CThreadPool Mostra como usar um pool de threads em um aplicativo e
como a implementação de um pool de threads pode melhorar
o desempenho do aplicativo.
DCOM Demonstra como chamar um objeto COM (implementado em
um serviço do Windows) de vários clientes em execução em
computadores diferentes.
MFCATL Ilustra como os objetos COM ATL podem ser usados em um
servidor MFC EXE.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Exemplos de ATL – controlesExemplos de ATL – controles
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
ATLFire Demonstra como criar um controle em janela usando ATL.
CDInfo Reproduz faixas de áudio de CD e exibe informações sobre as
faixas em dicas de ferramenta e uma exibição de gráfico de
pizza.
CIRC Cria um controle que demonstra páginas de propriedades e
desenha um círculo.
Polygon Cria um controle que implementa propriedades
personalizadas, eventos, páginas de propriedades e segurança
de objeto.
SubEdit Cria um controle doclass do Windows.
Exemplos de ATL-geralExemplos de ATL-geral
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
ATLCollections Demonstra o uso de ICollectionOnSTLImpl e e
CComEnumOnSTL a implementação de classes de política de
cópia personalizada.
ATLCon Demonstra um contêiner de controle simples.
ATLSafeArray Mostra como criar e manter SAFEARRAY s usando
CComSafeArray ; também como passar SAFEARRAY s de um
componente para um script.
AutoThread Demonstra como usar a CComAutoThreadModule classe.
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/Controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
Aviso sonoro Implementa uma interface de divisão de uma
coleção/enumeração de BSTR s.
CircColl Implementa uma coleção/enumeração de objetos usando ATL
e a biblioteca C++ padrão.
COMMap Demonstra macros de entrada de mapa de interface com com
suporte de COM do compilador.
Personalizadostring Mostra como usar um alocador de memória personalizado
para CStringT o para melhorar o desempenho em um
aplicativo multithread.
DispSink Demonstra o uso de um ponto de conexão em interfaces de
expedição.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Exemplos de ATL-OLEDB-ConsumerExemplos de ATL-OLEDB-Consumer
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
CatDB Exibe as informações de esquema, como tabelas e colunas, de
provedores de OLE DB.
DBViewer Demonstra um aplicativo de nível intermediário que depende
da CManualAccessor classe para assumir o controle total de
associações de dados para seus aplicativos.
DynamicConsumer Demonstra como usar classes de conjunto de linhas de
esquema e acessador dinâmico para ler metadados de um
banco de dados.
MultiRead Lê uma tabela em um banco de dados usando vários threads.
Exemplos de ATL-OLEDB-ProviderExemplos de ATL-OLEDB-Provider
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
AdvancedPV Implementa um provedor de OLE DB atualizável. Demonstra
algumas técnicas avançadas.
UpdatePV Implementa um provedor de OLE DB atualizável
(leitura/gravação).
Exemplos de CLR e linguagem-Windows Forms
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
BirthdayPicker Mostra como o mecanismo de recursos de .NET Framework
pode ser usado em aplicativos C++. Ele também demonstra
alguns componentes comuns do Window Forms.
Calculadora Implementa uma calculadora de bolso simples usando C++ e
as classes de WindowsForms de .NET Framework.
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/OLEDB/Consumer
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/OLEDB/Consumer
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/OLEDB/Consumer
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/OLEDB/Consumer
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/OLEDB/Provider
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ATL/OLEDB/Provider
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language/Windows Forms
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language/Windows Forms
Rabisco (usando o MFC) Uma implementação do MFC da amostra de rabisco,
atualizada e estendida para incluir a nova funcionalidade .NET.
Rabisco (Windows Forms) Uma Windows Forms implementação da amostra de rabisco,
atualizada e estendida para incluir a nova funcionalidade .NET.
STLCLR Demonstra alguns dos recursos disponíveis ao usar a
biblioteca STL/CLR.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Exemplos de eventos COM
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Comeventos Demonstra a manipulação de eventos usando COM.
Exemplos de ComTypeLibfor7
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
ACDual Adiciona interfaces duplas a um aplicativo de automação.
ADOSamp Implementa um aplicativo cliente/servidor de três camadas.
AllInOne Implementa um servidor usando ATL, expondo coleções STL e
controladas pelo suporte de COM do compilador em um
aplicativo MFC.
COMMap Demonstra macros de entrada de mapa de interface com com
suporte de COM do compilador.
Connect Ilustra o uso e a implementação de pontos de conexão (as
IConnectionPointContainer IConnectionPoint interfaces
e) em um ambiente multi-threaded.
DCOM Demonstra como chamar um objeto COM (implementado em
um serviço do Windows) de vários clientes em execução em
computadores diferentes.
FreeThrd Demonstra um cliente multithread e um servidor de thread
livre com suporte de COM do compilador.
InProc Demonstra um aplicativo de servidor de automação em
processo com suporte de COM do compilador.
Labrador Implementa um servidor EXE que não tem nenhuma interface
do usuário.
MFCCalc Demonstra um aplicativo de servidor de automação com
suporte de COM do compilador.
Exemplos de compilador
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/CLR/stlclr/StlClr Sample
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/ComTypeLibfor7
Exemplos de compilador-geralExemplos de compilador-geral
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
ccWrapper Demonstra como mapear sinalizadores de compilador C/C++
de outros compiladores para o compilador de Visual C++
(cl.exe).
Exemplos de compilador – MASMExemplos de compilador – MASM
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
EuclidStep1 Um projeto C puro que demonstra o algoritmo do Euclid para
localizar o maior divisor comum.
EuclidStep2 Uma extensão de EuclidStep1 que é um projeto misto de C e
MASM. O núcleo do algoritmo do Euclid é movido do .c
arquivo para um .asm arquivo, com o .c arquivo
chamando para o .asm arquivo.
PrimesStep1 Um projeto C puro que demonstra o Sieve de Eratosthenes
para localizar números primos.
PrimesStep2 Uma extensão de PrimesStep1 que é um projeto misto de C e
MASM que move o algoritmo de núcleo para o .asm
arquivo.
PrimesStep3 Uma extensão de PrimesStep2 que adiciona um arquivo de
cabeçalho C separado e um .asm arquivo de inclusão para
declarar a função externa e a estrutura de dados global.
Amostras de CRT
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
CPUID Determina os recursos da CPU que está sendo executada.
CRT_Dbg1 Ilustra os recursos básicos de depuração das bibliotecas de
tempo de execução do C.
CRT_Dbg2 Demonstra as funções de gancho de depuração em tempo de
execução do C.
DFACObjs Mostra como usar a função de tempo de execução
_CrtDoForAllClientObjects C para iterar por meio de uma lista
vinculada de objetos cliente.
Report Ilustra as funções de relatório de depuração em tempo de
execução do C.
RTC Demonstra o recurso de verificações de erro em tempo de
execução.
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Compiler
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Compiler/MASM
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Compiler/MASM
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Compiler/MASM
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Compiler/MASM
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Compiler/MASM
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/crt
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/crt
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/crt
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/crt
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/crt
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/crt
SecureCRT Este exemplo demonstra como atualizar o código que usava
funções de CRT preteridas para aumentar a segurança do
código.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Amostras de depuração
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
EEAddIn Usa a API do suplemento do avaliador de expressão para
estender o avaliador de expressão do depurador nativo.
Amostras de fusão
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Rastreador Fornece informações sobre assemblies dependentes do
aplicativo e o estado dos assemblies no cache do Fusion
nativo, em forma legível humana.
Exemplo de Hilo
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Hilo Hilo é uma série de artigos e aplicativos de exemplo. Eles
demonstram o poder do Windows 7, do Visual Studio e do
C++ para criar aplicativos cliente de alto desempenho e
responsivos. O Hilo fornece código-fonte e orientações que
ajudarão você a projetar e desenvolver aplicativos Windows
atraentes e habilitados para toque próprios.
Este exemplo foi atualizado para Visual Studio 2013. Ele inclui
um Hot Fix para o arquivo AsyncLoaderMemoryManager. cpp
(nas linhas 36 e 37), que trata de um problema de falha
comum.
Exemplos internacionais
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
IME Demonstra como controlar o modo do editor de método de
entrada e como implementar o nível 3 do IME.
SatDLL Demonstra uma maneira recomendada paraimplementar
recursos multilíngües em um aplicativo Win32.
UniRes Demonstra o uso de arquivos de recursos Unicode.
Exemplos de linguagem-geral
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/crt
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples
https://github.com/Microsoft/VCSamples/tree/master/VC2013Samples/Hilo
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/International
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/International
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/International
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Dados Demonstra o acesso simples a um banco de dados SQL.
MEDriver Ilustra o uso de eventos COM (acionados de um servidor
COM não gerenciado) por meio de um wrapper .NET
Framework, gerado automaticamente a partir da biblioteca de
tipos do servidor COM.
Nilo Demonstra ASP.NET Web Forms e ASP.NET Web Services.
QStat Mostra como criar uma DLL que encapsula o acesso a um
objeto COM e expõe sua funcionalidade para .NET Framework
clientes.
Rabisco Demonstra como desenvolver um aplicativo Windows Forms
MDI usando C++/CLI e as classes de .NET Framework.
TilePuzzle Demonstra a interoperabilidade entre componentes
gerenciados (escritos com C++ e C#) e componentes nativos
(escritos com C++ usando atributos COM).
Exemplos de MFC
Exemplos de MFC – avançadoExemplos de MFC – avançado
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Reúnem Demonstra classes de coleções baseadas em modelo do MFC
C++ e classes de coleção predefinidas padrão.
Simples Aplicativo OpenGL usando contextos de dispositivo MFC
juntamente com contextos de recurso OpenGL.
DLLHusk Compartilhando a versão de DLL da biblioteca de classes base
com um aplicativo e uma DLL personalizada.
DLLScreenCap Uma DLL regular que pode ser vinculada estática ou
dinamicamente à biblioteca MFC.
MTGDI Demonstração do compartilhamento de recursos GDI entre
vários threads usando o suporte SDI (interface de documento
único) da estrutura para documentos e exibições.
MTMDI Ilustração de multithread, onde os eventos de interface do
usuário são processados em um thread de interface de
usuário separado.
MTRecalc Ilustração de multithread, em que os recálculos são feitos em
um thread de trabalho.
Mutexes Aplicativo baseado em caixa de diálogo que cria dois
CWinThread objetos e os usa para realizar uma tarefa sob o
controle do usuário.
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/Language/General
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
Fala Demonstra som multimídia usando recursos definidos pelo
usuário.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Exemplos de MFC – controlesExemplos de MFC – controles
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Botão Demonstra o uso de um menu ativo no local, uma página de
propriedades de estoque e a opção de controle da caixa sobre.
CIRC Demonstra noções básicas do controle ActiveX. Isso inclui
pintura de controle, ações e propriedades personalizadas,
ações e eventos personalizados, uso de cores e fontes, a
página de propriedades fonte de estoque, a página de
propriedades padrão e controle de versão.
CmnCtrl Demonstra alguns dos novos controles disponíveis com MFC
em wiprlhext: o botão de link de comando ( CButton ), o
controle de pager ( CPagerCtrl ), o botão de divisão (
CSplitButton ) e o controle de endereço de rede (
CNetAddressCtrl ).
Contêm Demonstra um aplicativo de contêiner de edição visual.
Imagem Demonstra como usar o MFC para criar um controle ActiveX
que baixa dados de forma assíncrona.
Licenças Um controle que impõe o uso de uma licença de tempo de
design e tempo de execução.
Localize Um controle com uma interface do usuário localizada que
demonstra o uso de bibliotecas de tipos separadas e DLLs
(bibliotecas de vínculo dinâmico) de recursos para localização.
NETADDR Demonstra o uso do controle "net address Verifier" do
Windows Vista.
Amigo Controle que exibe as cores de uma paleta. Ele demonstra
propriedades somente leitura, propriedades de Get/Set
persistentes, propriedades parametrizadas persistentes e
propriedades de imagem.
Push Controle de subclasse de um controle de botão desenhado
pelo proprietário do Windows. Ele demonstra as propriedades
de ações, os eventos personalizados e os contentores de
imagem.
RegSvr Demonstra a invocação de código de Autoregistro.
Índia Um controle com a aparência visual de uma discagem de
rotação que demonstra a validação de dados da página de
propriedades.
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/advanced
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
TestHelp Um controle ActiveX que tem seu próprio arquivo de ajuda e
dicas de ferramenta.
Hora Um controle invisível no tempo de execução e dispara um
evento de temporizador em intervalos definidos. Demonstra
as funções de notificação e as propriedades de ambiente.
XList Um controle, uma subclasse de uma caixa de listagem do
Windows, que exibe texto ou itens de bitmap.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Exemplos de MFC-geralExemplos de MFC-geral
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Clip-Art O diretório ClipArt contém recursos de exemplo que você
pode usar para personalizar a aparência do seu aplicativo.
CmnCtrl1 Demonstra como criar e alterar os estilos de controles comuns
do Windows usando classes do MFC (parte 1).
CmnCtrl2 Demonstra como criar e alterar os estilos de controles comuns
do Windows usando classes do MFC (parte 2).
CTaskDialog Demonstra vários recursos da CTaskDialog classe.
CtrlBars Barra de ferramentas personalizada e barra de status, barra de
diálogo e paleta flutuante.
CtrlTest Caixa de listagem de desenho proprietário e menu, controle
personalizado, botão bitmap, controle de rotação.
DBVList Usa as CListView CDaoRecordset classes e para
implementar a funcionalidade de exibição de lista virtual
disponível para o controle Commonde exibição de lista.
DIBLook Demonstra o uso de DIBs e paletas de cores.
DlgCbr32 Adicionar uma barra de ferramentas e uma barra de status a
um aplicativo baseado em caixa de diálogo.
DlgTempl Demonstra a criação dinâmica de modelos de caixa de diálogo.
DockTool Barras de ferramentas de arrastar e flutuantes que são
encaixáveis.
Dynamenu Modificando dinamicamente a lista de itens em menus;
manipulando comandos não conhecidos no momento da
compilação; e atualizando o prompt de comando da barra de
status para esses comandos.
FileDlgWatcher Cria uma caixa de diálogo personalizada que ilustra quais
eventos são gerados quando você cria um CFileDialog .
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/controls
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
Olá Ilustra uma janela de aplicativo único com um menu e uma
caixa sobre.
HelloApp Exemplo de MFC mínimo que ilustra que poucas linhas de
código são necessárias para fazer com que uma janela apareça
na tela.
ListHdr Demonstra como usar as classes do MFC de controle comum
CListCtrl e o CHeaderCtrl .
MDI Aplicativo MDI que não usa documentos e exibições.
MDIDocVw Versão atualizada do exemplo de MDI que usa a arquitetura
de documento/exibição.
MMXSwarm Demonstra como usar CImage o, o __m64 tipo de dados e
bitmaps independentes de dispositivo (DIBs).
Sem janela restrita Demonstra o uso de um CDialog objeto MFC como uma
caixa de diálogo sem janela restrita.
Multipad O editor de texto simples permite que o usuário abra e edite
vários arquivos de texto ao mesmo tempo.
Npp Demonstra como implementar um aplicativo de interface (SDI)
semelhante ao bloco de notas. Ele permite que você edite
mensagens de texto e envie-as para outros usuários ou
outros sistemas por meio da API de mensagens do Windows
ou MAPI.
PropDlg Folhas de Propriedades (caixas de diálogo).
Lista de listas Ilustra a seleção de linha completa em um controle comum de
exibição de lista.
Rabisco Fornece ilustrações simples de uma ampla variedade de
recursos do MFC.
SimpleImage Demonstra o carregamento, o redimensionamento, a
conversão e a gravação de imagens.
SnapVw Mostra como usar páginas de propriedades em uma janela de
quadro filho MDI.
Spiro Um jogo que mostra o uso CImageList e como usar os
contextos de exibição de memória em aplicativos que exigem
efeitos de animação.
Posição Demonstra vários CRectTracker estilos e opções.
VariantUse Demonstra o uso do tipo de dados Variant.
ViewEx Várias exibições, exibição de rolagem, janelas de divisão.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/general
Exemplos do MFC – InternetExemplos do MFC – Internet
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
DHTMLExplore Demonstra o tratamento de eventos DHTML e o uso de
campo DDX DHTML.
HTMLEdit Encapsula o controle de edição do Internet Explorer MSHTML.
MFCIE Demonstra o MFC CHtmlView e as CReBar classes.
Agendador Demonstra como criar uma caixa de diálogo baseada em
HTML usando as classes de bibliotecas de Visual C++.
Exemplos de MFC – OLEExemplos de MFC – OLE
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
ACDual Demonstra como adicionar suporte de interface dupla a um
servidor de automação baseado em MFC.
AutoClik Ilustra os recursos de automação. Inclui o AUTODRIV, um
aplicativo cliente de automação simples que orienta o
aplicativo de exemplo AUTOCLIK.
CalcDriv Cliente de automação.
DrawCli Aplicativo de desenho orientado a objeto completo que
também é um contêiner de edição visual do ActiveX.
HierSvr Demonstra um aplicativo de servidor com arrastar e soltar
OLE.
InProc Um servidor de automação em processo que pode ser
carregado como uma DLL no espaço de endereço do cliente.
IPDrive Um aplicativo cliente de automação simples que orienta o
aplicativo de exemplo INPROC.
MFCBind Mostra como criar um contêiner de documento ativo
(anteriormente conhecido como DocObject).
MFCCalc Um servidor de automação que implementa uma calculadora
simples.
OClient Aplicativo de contêiner de edição visual do ActiveX, com
arrastar e soltar.
OLEView Implementação de um pesquisador de objetos OLE por meio
de interfaces OLE personalizadas.
SuperPad Demonstra um servidor de edição visual que edita texto
usando CEditView.
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/internet
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/internet
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/internet
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/internet
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
TstCon Implementa um contêiner de controleActiveX usando o
suporte do MFC para inserção de OLE. Você pode usar
TSTCON para testar controles ActiveX, alterar suas
propriedades e invocar seus métodos.
Desses Usa o suporte do MFC para controles de edição avançados
para criar um processador de texto básico.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Exemplos de MFC – utilitárioExemplos de MFC – utilitário
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
GUIDGen Um aplicativo MFC simples baseado em diálogo que gera
identificadores globais exclusivos.
Makehm Um aplicativo de console que produz um mapeamento entre
as identificações de recurso e os contextos de ajuda.
Exemplos de MFC-Visual C++ 2008 Feature PackExemplos de MFC-Visual C++ 2008 Feature Pack
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
CustomPages Demonstra como adicionar uma página personalizada à caixa
de diálogo personalização da barra de ferramentas.
DesktopAlertDemo Demonstra como implementar uma caixa de diálogo de alerta
da área de trabalho (semelhante à caixa de diálogo de um
aplicativo de mensagens instantâneas).
DlgToolTips Demonstra como implementar dicas de ferramenta avançadas
para controles em uma caixa de diálogo.
DrawClient Demonstra como integrar o suporte para uma faixa de faixas
em um aplicativo de desenho com suporte a contêiner de
edição.
DynamicMenu Demonstra como atualizar dinamicamente um menu na barra
de menus e um menu pop-up em tempo de execução.
Explorer Demonstra como implementar um Gerenciador de sistema de
arquivos que se assemelha ao explorador de arquivos. Ele tem
elementos e funcionalidades de interface do usuário
semelhantes.
IEDemo Demonstra como implementar um aplicativo semelhante ao
Internet Explorer, com elementos e recursos de interface do
usuário semelhantes.
MDITabsDemo Demonstra como criar um aplicativo que usa a nova interface
documentos MDI com guias em vez das janelas filho MDI
tradicionais.
MenuSubSet Demonstra como remover dinamicamente itens de menu e
submenus específicos na inicialização do aplicativo.
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/ole
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/utility
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/utility
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
MSMoneyDemo Demonstra como usar o MFC para criar uma interface do
usuário semelhante ao Microsoft Money.
MSOffice2007Demo Demonstra como implementar um aplicativo de editor
semelhante a um aplicativo do Office 2007, com elementos de
interface do usuário semelhantes e recursos semelhantes
limitados. O exemplo MSOffice2007Demo implementa uma
interface do usuário de faixa de medida completa, assim como
um aplicativo do Office 2007. Alguns dos elementos da faixa
de faixas estão conectados aos recursos no aplicativo.
NewControls Demonstra os recursos de muitos dos controles
implementados no MFC. Esses controles incluem botões
personalizáveis, controles seletores de cores e paletas, um
seletor de fontes, um editor de imagens, uma grade de
propriedades, um controle de edição mascarado e controles
de árvore e de Shell.
OutlookDemo Demonstra como criar um aplicativo semelhante ao Outlook
2003/2007.
OutlookMultiViews Demonstra como alternar entre várias exibições em um único
documento em um aplicativo SDI. O exemplo usa o controle
da barra do Outlook para listar os modos de exibição
disponíveis e alternar entre eles.
OwnerDrawMenu Ilustra como desenhar itens de menu pop-up dinamicamente.
PaletteDemo Ilustra como criar uma barra de ferramentas de várias colunas
com uma área de informações de desenho proprietário. Clique
em 2, 3 ou 4 botões na barra de ferramentas padrão para
alterar em tempo de execução o número de colunas da barra
de ferramentas personalizada.
PropSheetDemo Ilustra os seguintes tipos de controle de folha de
propriedades: simples, com guias no lado esquerdo, com
controle de árvore no lado esquerdo, guias de estilo do
OneNote, lista de itens no lado esquerdo.
RebarTest Demonstra um controle rebar personalizável que hospeda
uma barra de ferramentas.
RibbonGadgets Ilustra vários controles que podem ser hospedados no
controle Ribbon. Na parte inferior do quadro principal, você
pode encontrar a janela de código-fonte com o texto do
código-fonte, que descreve como criar um gadget específico.
RibbonMDI Demonstra o uso do controle Ribbon com a interface de
vários documentos.
RollupPane Demonstra um painel "informações" flutuante, que se acumula
automaticamente. Você pode pressionar o botão fixar na
legenda do painel flutuante para ativar e desativar a ativação.
SetPaneSize Demonstra como definir o tamanho do painel de encaixe
programaticamente.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
Controle deslizante Demonstra como implementar um botão da barra de
ferramentas que hospeda um controle externo.
Estado da Demonstra como implementar um aplicativo que salva e
carrega Estados diferentes para a barra de menus, barras de
ferramentas e janelas de encaixe.
StatusBarDemo Demonstra como adicionar vários controles avançados a uma
barra de status.
TabbedView Demonstra como criar uma exibição que contém várias
exibições com guias, como as guias em uma pasta de trabalho
do Excel.
TabControl Demonstra o controle da guia MFC e as diferentes aparências
que usam diferentes propriedades e gerenciadores visuais.
TasksPane Demonstra as classes do painel de tarefas do MFC e suas
diferentes aparências usando várias propriedades e
gerenciadores visuais.
ToolbarDateTimePicker Demonstra como integrar um controle seletor de data/hora
com a barra de ferramentas
ToolTipDemo Demonstra como usar os recursos avançados dadica de
ferramenta do MFC.
TrayMenu Ilustra a capacidade de usar os menus da barra de controle do
MFC com o ícone de bandeja do sistema. É semelhante aos
ícones de notificação no canto inferior direito da tela.
VisualStudioDemo Demonstra como implementar um aplicativo com muitos dos
mesmos recursos e funcionalidades da interface do usuário do
Visual Studio. Muitos dos elementos da interface do usuário
do Visual Studio são demonstrados, incluindo uma barra de
ferramentas de encaixe personalizável, Toolbar e Windows.
Desses Demonstra como implementar um aplicativo que imita a
funcionalidade do WordPad, incluindo os elementos da
interface do usuário e alguns dos recursos.
WorkSpaceToolBar Demonstra como adicionar uma barra de ferramentas a um
painel de encaixe. Ele é semelhante à barra de ferramentas em
Gerenciador de Soluções no Visual Studio.
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Exemplos de MFC-Windows TouchExemplos de MFC-Windows Touch
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
GestureDemo Demonstra o suporte ao Windows Touch no MFC (requer
hardware de toque).
TouchDemo Demonstra o suporte ao Windows Touch no MFC (requer
hardware de toque).
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/Visual C%2B%2B 2008 Feature Pack
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/WindowsTouch
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples/MFC/WindowsTouch
Exemplos de ODBC
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
odbcsql Este exemplo demonstra como usar APIs ODBC para se
conectar ao e acessar o banco de dados.
Exemplos de so
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
GetImage Demonstra as APIs (interfaces de programação de aplicativo)
do Windows Image Acquisition (WIA).
Exemplos de UNIX
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
UNIX-ccWrapper Demonstra um wrapper que mapeia os sinalizadores dos
compiladores Sun forte e gcc para o compilador de Microsoft
Visual C++ (cl.exe).
Exemplos do Windows 8
N O M E DA A M O ST RAN O M E DA A M O ST RA DESC RIÇ Ã ODESC RIÇ Ã O
Exemplo de transferência em segundo plano (Windows 8) Este exemplo demonstra o comportamento amigável, com
reconhecimento de custos e flexível da API de transferência
em segundo plano para aplicativos Windows Runtime. Os
cenários de exemplo fornecidos abrangem downloads de
arquivos e uploads.
Exemplo de CryptoWinRT (Windows 8) Este exemplo mostra como usar as novas APIs de criptografia.
O pacote de exemplo do Windows 8 inclui todos os exemplos de código do aplicativo desenvolvidos e atualizados
para o Windows 8. O pacote de exemplo fornece uma maneira conveniente de baixar todos os exemplos de uma
só vez. Os exemplos neste pacote de exemplo estão disponíveis em C#, C++, VB.NET e JavaScript. A Galeria de
exemplos do Windows contém exemplos de código que exercitam os vários novos modelos de programação,
plataformas, recursos e componentes disponíveis no Windows 8 e no Windows Server 2012. Esses exemplos
baixáveis contêm o arquivo da solução do Visual Studio (sln), os arquivos de origem, os ativos, os recursos e os
metadados necessários para compilar e executar com êxito.
Mais informações estão disponíveis sobre os modelos de programação, plataformas, linguagens e APIs
demonstrados em cada exemplo. Consulte a orientação, os tutoriais e os artigos de referência fornecidos na
documentação do Windows 8, disponível na central de desenvolvedores do Windows. Esses exemplos são
fornecidos no estado em que se encontram, para demonstrar a funcionalidade dos modelos de programação e
APIs de recursos para o Windows 8 e o Windows Server 2012.
https://github.com/Microsoft/VCSamples/tree/master/VC2012Samples/ODBC Database sample
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples
https://github.com/Microsoft/VCSamples/tree/master/VC2010Samples
https://github.com/Microsoft/VCSamples/tree/master/VC2012Samples/Windows 8 samples/C%2B%2B/Windows 8 app samples
https://github.com/Microsoft/VCSamples/tree/master/VC2012Samples/Windows 8 samples/C%2B%2B/Windows 8 app samples
Exemplo de impressão (Windows 8) Este exemplo demonstra como os aplicativos podem integrar
a experiência de impressão do Windows. Os cenários
demonstrados neste exemplo incluem: impressão do aplicativo
usando a barra de botões e o contrato de impressão,
impressão de dentro da experiência do aplicativo e muito
mais.
Exemplo de HttpClient (Windows 8) Este exemplo demonstra o uso da classe HttpClient e da
interface IXMLHTTPRequest2 para carregar e baixar vários
tipos de conteúdo de um servidor HTTP usando os recursos
de rede fornecidos pelo Windows Runtime.
Exemplo de sensor do acelerômetro (Windows 8) Este exemplo mostra como usar a
Windows.Devices.Sensors.Accelerometer API. Este
exemplo permite que o usuário exiba as forças de aceleração
nos eixos X, Y e Z de um acelerômetro de 3 eixos. Você pode
escolher um dos três cenários.
Exemplo de nome de imagem da conta (Windows 8) Este exemplo demonstra diferentes maneiras de obter o nome
do usuário que está conectado no momento. Ele também
demonstra como obter e definir a imagem usada para o bloco
do usuário.
Exemplo de configurações de aplicativo (Windows 8) Este exemplo demonstra como usar os submenus API
ApplicationSettings e configurações para integrar a interface
do usuário de configurações do aplicativo com o botão
Configurações. O exemplo usa o
Windows.UI.ApplicationSettings namespace e
WinJS.UI.SettingsFlyout .
Aplicativo de dispositivo da Windows Store para exemplo de
câmera (Windows 8)
Este exemplo demonstra como criar um aplicativo de
dispositivo da Windows Store para uma câmera. Um aplicativo
de dispositivo da Windows Store é fornecido por um IHV ou
OEM para diferenciar a experiência de captura de uma câmera
específica.
Introdução ao exemplo de leitor de blog simples do C++
(Windows 8)
O exemplo demonstra alguns princípios básicos do
desenvolvimento de aplicativos da Windows Store em C++
nativo usando XAML para definir a interface do usuário. É
uma versão de trabalho completa do aplicativo abordada no
Windows Developer Center.
Exemplo de leitura e gravação de dados (Windows 8) Este exemplo mostra como usar as classes DataReader e
DataWriter para armazenar e recuperar dados.
Exemplo de dados de aplicativo (Windows 8) Este exemplo mostra como armazenar e recuperar dados que
são específicos de cada usuário e aplicativo da Windows Store
usando as APIs de dados do aplicativo Windows Runtime. Os
dados do aplicativo incluem estado de sessão, preferências do
usuário e outras configurações.
Exemplo de acesso de driver personalizado (Windows 8) Este exemplo mostra como usar CreateDeviceAccessInstance e
IDeviceIoControl para acessar um dispositivo especializado.
Exemplo de ListView