No Bootstrap 4 deve-se usar a text-centerclasse para alinhar blocos embutidos .
NOTA: text-align:center;definido em uma classe personalizada que você aplica ao seu elemento pai, funcionará independentemente da versão do Bootstrap que você estiver usando. E é exatamente isso que .text-centerse aplica.
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<div class="container">
<div class="row">
<div class="col text-center">
<button class="btn btn-default">Centered button</button>
</div>
</div>
</div>
Se o conteúdo a ser centralizado for block ou flex (not inline-), pode-se usar o flexbox para centralizá-lo:
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<div class="d-flex justify-content-center">
<button class="btn btn-default">Centered button</button>
</div>
... que se aplica display: flex; justify-content: center ao pai.
Observação: não use em .row.justify-content-centervez de .d-flex.justify-content-center, pois .rowaplica margens negativas em determinados intervalos de resposta, o que resulta em barras de rolagem horizontais inesperadas (a menos que .rowseja filho direto de.container , que aplica preenchimento lateral para neutralizar a margem negativa, nos intervalos de resposta corretos). Se você deve usar .row, por qualquer motivo, substitua sua margem e preenchimento com .m-0.p-0, nesse caso, você acabará com praticamente os mesmos estilos que.d-flex .
Observação importante: a segunda solução é problemática quando o conteúdo centralizado (o botão) excede a largura do pai ( .d-flex), especialmente quando o pai tem largura de janela de visualização, especificamente porque torna impossível rolar horizontalmente para o início do conteúdo (à esquerda a maioria).
Portanto, não o use quando o conteúdo a ser centralizado puder se tornar mais largo do que a largura pai disponível e todo o conteúdo estiver acessível.