С [expr.const.cast] / 3 :
Для двух аналогичных типов T1 и T2 значение типа T1 может быть явно преобразовано в тип T2 использование const_cast, если, учитывая cv-разложения обоих типов, каждый P i 1 совпадает с P i 2 для всех i . Результат const_cast ссылается на исходную сущность.
Похоже, что const приведен к не указателю не ссылочного типа. Например, следующая функция
void f(int a)
{
const_cast<int>(a);
}
должна быть правильно сформирована, поскольку int
и int
, безусловно, являются похожими типами и не имеют P i. в их cv-разложениях (таким образом, утверждение, что «каждый P i 1 совпадает с P i 2 для всех i"должно быть истинным).
Однако оба G CC и Clang отклоняют приведенный выше код (см. Проводник компилятора ). Сообщения об ошибках:
Clang:
<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);
| ^
G CC:
<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{});
}