reinterpret_cast из rvalue в ссылку rvalue - PullRequest
8 голосов
/ 26 мая 2019

Просто скомпилируйте тест. gcc принимает следующее, в то время как clang и msvc отклоняют его: https://godbolt.org/z/DlUasL

float test()
{
    return reinterpret_cast<float&&>(0x7F800000);
}

Какой из них соответствует стандарту?

1 Ответ

8 голосов
/ 26 мая 2019

Преобразование, которое ищет это reinterpret_cast выражение, не входит в список преобразований [expr.reinterpret.cast] , которые reinterpret_cast может выполнить [expr.reinterpret.cast] / 1 . 0x7F800000 - это литерал целочисленного типа. Единственное преобразование reinterpret_cast, которое может выполнить преобразование из значения целочисленного типа в некоторый другой тип, - это преобразование такого значения в тип указателя [expr.reinterpret.cast] / 5 . float&& является ссылочным типом, а не типом указателя. Единственное преобразование reinterpret_cast, которое может выполнить преобразование в , в ссылочный тип, - это преобразование выражения glvalue [expr.reinterpret.cast] / 11 . 0x7F800000 не глуву. Таким образом, этот код плохо сформирован. Тот факт, что GCC примет это, довольно удивителен для меня и, я бы сказал, определенно является ошибкой, о которой следует сообщить & hellip;

...