Você consegue adivinhar a saída deste programa trivial?
#include <vector>
#include <string>
#include <exception>
#include <iostream>
using namespace std;
int main()
{
try {
struct X {
explicit X(int) {}
X(string) {} // Just to confuse you more...
};
vector<X>{"a", "b"};
} catch (exception& x) {
cerr << x.what();
}
}
Bem, eu não poderia, o que me custou um dia de "pesquisa", antes de chegar aqui, finalmente destilando-o de algum código complexo da vida real (com aliases de tipo em todos os lugares, anon. uniões com não-membros do POD e mão- ctors/dtors orquestrados etc., apenas para dar uma vibe).
E... ainda não consigo ver o que está acontecendo! Alguém pode dar uma dica gentil? (Espero que seja apenas um ponto cego. Não faço mais C++ profissionalmente.)
/W4
Nota: compilação limpa* com MSVC e GCC (mais recentes) -Wall
; mesma saída em ambos (semanticamente).
* Mesmo sem a linha "confundir o leitor". Acho que vou ter pesadelos.
(Por favor, tenha paciência comigo por tentar não estragar tudo, explicando tudo ainda mais - afinal, isso é realmente autoexplicativo como está, certo? Exceto, exatamente o oposto para mim...)
Isso cria um vetor a partir de dois iteradores do tipo
const char*
usando o construtor que leva dois iteradores:É apenas azar que o decaimento dos dois
const char[]
se torne iteradores perfeitos que atendem ao requisito LegacyInputIterator .Os iteradores não apontam para uma matriz/área contígua e o programa, portanto, tem um comportamento indefinido.
O que acontece nos bastidores é mais provável que ele tente passar do primeiro
const char*
para o segundo e fique fora dos limites assim que passar pelo terminador nulo após o'a'
.Uma construção semelhante que realmente funcionaria: