Como descobrir quais funções o compilador gerou?

11

Conheço as funções geradas pelo compilador, a regra de três e a regra de cinco. Em cenários do mundo real, pode não ser trivial descobrir exatamente quais funções geradas pelo compilador (construtores, operadores de atribuição, destruidor) foram realmente criadas pelo compilador.

Existe alguma maneira de listar as funções geradas pelo compilador para uma classe específica?

Estou interessado principalmente no Visual Studio 2019 e no Xcode, mas uma solução genérica seria ainda mais bem-vinda.

Helge Klein
fonte

Respostas:

11

As regras são complicadas. Vou roubar outra resposta que cite uma tabela da apresentação de Howard Hinnant .

insira a descrição da imagem aqui

A moral aqui é que uma boa prática é não confiar em declarações implícitas do compilador e declarar explicitamente todos os membros especiais (como padrão ou excluído, dependendo de suas necessidades)

Bolov
fonte
Se você declarar explicitamente todos os membros especiais, perderá o status "não declarado" de membros especiais para mover o construtor e o operador de atribuição.
Maxim Egorushkin
@MaximEgorushkin, meu ponto é declará-los padrão se você precisar deles (embora o padrão ainda possa significar não declarado) ou excluído se você não os quiser.
bolov 6/01
2
@ bolol O gráfico é útil, mas isso não responde à minha pergunta. Eu quero descobrir quais funções foram realmente geradas pelo compilador. Em outras palavras: não estou perguntando sobre o que deveria acontecer na teoria, mas o que está acontecendo na prática.
Helge Klein
11
@ tjwrona1992: Por esse argumento, nunca precisaríamos testar nosso código, porque saberíamos que, se o compilador fizesse algo diferente do que pretendíamos, deveria haver um erro.
ruakh 7/01
11
@ tjwrona1992: Sim, exatamente. Da mesma forma, o ponto de ver o que o seu compilador gerou não é verificar se o compilador está correto, mas verificar se você forneceu a entrada correta ao compilador.
ruakh 8/01
7

"Existe alguma maneira de listar as funções geradas pelo compilador para uma classe específica?"

Claro que existe. No Linux (e outros sistemas Unix) você pode usar nm, readelfe objdumpno objeto arquivos gerados / bibliotecas / executável para desmontá-los e inspecionar quaisquer símbolos exportados (e muito mais).

Existem ferramentas semelhantes no Windows , eu sei, mas essa não é uma plataforma com a qual trabalho muito, então, infelizmente, não posso nomear nomes exatos de ferramentas lá.

Jesper Juhl
fonte
11
Embora essas ferramentas possam muito bem não mostrar quais funções podem ter sido geradas (ou seja, o compilador foi autorizado a gerá-las, mas você nunca as usou, por isso decidiu não se incomodar ou a eliminação do código no tempo do link se livrou delas)
JMAA 6/01
@JMAA Na maioria dos casos, "permitido gerar, mas nunca usado" significaria, em termos padrão, que uma função foi "declarada implicitamente", mas não "definida implicitamente". Sim, isso ainda significa que você não verá os símbolos, mesmo se o inlining estiver desativado.
aschepler
11
A rigor, essa resposta responde com mais precisão à pergunta: "Quais métodos o compilador gerou?" Isso não é o mesmo que a pergunta muito menos precisa "Quais métodos podem ter sido gerados pelo compilador em um contexto diferente?"
rici 6/01
@rici True. Mas a pergunta mais precisa não é fácil de responder, então procurei o que poderia ser respondido. Sinta-se livre para votar se você acha que minha resposta não é valiosa.
Jesper Juhl
11
@ jesper: não, eu já votei. Acho que a pergunta que você respondeu é mais precisa, como eu disse. A outra pergunta, que pode ter sido a intenção, requer um pouco de agitação manual porque é contrafactual: não sabemos quais contextos hipotéticos podem incluir. Mas esta é a pergunta literalmente feita, intencionalmente ou não, então parabéns por respondê-la.
rici 6/01
1

Atualmente, isso é apenas uma resposta parcial.

Visual Studio 2019

Construtores

Ao definir um objeto de classe, a função IntelliSense do Visual Studio mostra os construtores disponíveis, gerados pelo compilador e os seus:

insira a descrição da imagem aqui

Infelizmente, essas informações nem sempre são exibidas. Para que funcionasse para a captura de tela acima, tive que digitar algo entre parênteses, daí a vírgula.

Helge Klein
fonte