É proibido usar std::bit_cast
para conversão de ou para std::nullptr_t = decltype(nullptr)
o tipo? E se for permitido, 1) o resultado de deve std::bit_cast
ser o mesmo que static_cast
, 2) a conversão de ida e volta deve retornar o valor original?
Testei os compiladores atuais e todos eles aceitam o seguinte programa sem nenhum aviso:
#include <bit>
#include <iostream>
int p = 0;
auto n = std::bit_cast<decltype(nullptr)>( &p );
int main() {
std::cout
<< (std::bit_cast<int*>(n) == static_cast<int*>(n))
<< ' '
<< (&p == std::bit_cast<int*>(n));
}
Mas os compiladores divergem na forma como tratam as conversões, o que é visível na saída do programa:
- Impressões sonoras
0 1
. - Impressões GCC
1 0
. - Impressões MSVC
1 1
.
Demonstração online: https://gcc.godbolt.org/z/fbEGvGs4v
Qual implementação está correta aqui, se houver alguma?
[basic.types.general]/4 define representação de valor como "o conjunto de bits na representação de objeto de
T
que participam na representação de um valor do tipoT
". [conv.lval]/3.1 diz que a conversão de lvalue para rvalue em umnullptr_t
objeto produz uma constante de ponteiro nulo sem nem mesmo acessar seu armazenamento. Segue-se que a representação de valor denullptr_t
é necessariamente vazia e cada bit em sua representação de objeto é um bit de preenchimento.Sendo esse o caso, a representação de objeto produzida por um
bit_cast
tonullptr_t
é totalmente não especificada , e obit_cast
back tem comportamento indefinido porque cada bit na representação de valor produzida é indeterminado e o bit indeterminado não está contido em um objetounsigned char
orstd::byte
.Todos os três compiladores estão em conformidade.