Q:

validando somente .com.br regex

Pessoal estava modificando uma regex para validar somente domínios específicos que termine com yahoo.com.br, terra.com.br, bol.com.br, hotmail.com.br.  Então gmail.com, ou provedor.net.br seriam inválidos. 
Então fiz a regex abaixo: 
const std::regex pattern("([a-zA-Z0-9._]+@[hotmail|terra|yahoo|bol]+(?:[.][com]{2,4})?(?:[.][br]{1,2})?)"); 

Mas está validando também email que termine somente com .com ou se eu digitar: usuario@yahoo.com ele valida e não poderia validar. 
Já tentei fazer da seguinte forma:
const std::regex pattern("([a-zA-Z0-9._]+@(?:[hotmail.com.br|terra.com.br|yahoo.com.br|bol.com.br]{2,4})?)"); 

Mas aí ele retorna tudo inválido.  Alguma sugestão? 

A:

Não está funcionando pois, da primeira forma, você está colocando um ?  no br.  Isso, no regex, quer dizer que o valor é opcional. 
A segunda forma, quando você informa {2,4}, você quer dizer para o software pegar apenas os dados entre 2 e 4 caracteres, por isso ele só pega metade do valor e consequentemente valida. 
Outro problema é que você está utilizando o com, br e os provedores, dentro dos colchetes.  Isso faz com que o código pegue informações que possuem as mesmas letras, não necessariamente a palavra.  Ex: Ele valida valores como hootmail, hhhooottmmmaaiill, etc.  O ideal nesse caso, é utiliza parentes. 
Para seu caso, o regex abaixo deve funcionar. 
([a-zA-Z0-9._]+@(?:hotmail|terra|yahoo|bol)\.(?:com\.br))
Regex
Regex Debugger
Regex Tests

