Для двух похожих типов T1 и T2 prvalue типа T1 может быть явно преобразовано в тип T2 с помощью const_cast, если, учитывая cv-разложения обоих типов, каждое P i 1 совпадает с P i 2 sup> для всех i. Результат const_cast относится к исходной сущности.
Кажется, что константное приведение к не-указательному не ссылочному типу разрешено. Например, следующая функция
void f(int a)
{
const_cast<int>(a);
}
должны быть правильно сформированы, поскольку int
и int
, безусловно, являются схожими типами и не имеют P i в их cv-разложениях (отсюда утверждение, что "каждый P i 1 совпадает с P i 2 для всех i "должно быть истинным).
Однако и GCC, и Clang отклоняют приведенный выше код (см. Compiler Explorer). Сообщения об ошибках
Лязг:
<source>: In function 'void f(int)':
<source>:3:22: error: invalid use of const_cast with type 'int', which is not a pointer, reference, nor a pointer-to-data-member type
3 | const_cast<int>(a);
| ^
GCC:
<source>: In function 'void f(int)':
<source>:3:5: error: invalid use of 'const_cast' with type 'int', which is not a pointer, reference, nor a pointer-to-data-member type
3 | const_cast<int>(a);
| ^~~~~~~~~~~~~~~~~~
Я что-то упускаю или это ошибка компилятора?
ОБНОВЛЕНИЕ: тоже не работает:
void f()
{
const_cast<int>(int{});
}
a
не является prvalue, это lvalue, поэтому приведение не выполняется. - person Remy Lebeau   schedule 03.04.2020T t; const_cast<T>(t)
будет примером (который материализует временный) - person M.M   schedule 03.04.2020