Преобразование, которое может обрабатывать C-стиль, но С++ casts не может
Говорят, что C-style cast просто пытается применить другую комбинацию С++-трансляций, и используется первая разрешенная комбинация. Однако у меня возникает ощущение, что я слышал, что есть ситуации, которые могут обрабатывать только C-стиль, но ни одна из комбинаций С++-бросков не допускается.
Неужели я ошибаюсь? Это правда, что любой C-стиль в любом контексте (на С++) может быть заменен на правильную комбинацию С++-трансляций?
UPD Благодаря Cheers и hth. - Alf, мы имеем пример того, что С++-касты не могут справиться в том смысле, что они не могут создать определенное и ожидаемое поведение. Расширенный вопрос заключается в том, чтобы представить пример, который С++-касты не могут справиться с тем, что его нельзя даже скомпилировать?
Ответы
Ответ 1
Передача в недоступную базу может быть выражена только в виде стилей C (один из синтаксических вариантов). В этом контексте он эквивалентен static_cast
, который может изменить адрес, за исключением того, что static_cast
не может получить доступ к базе.
Пример:
struct Base
{
int x = 42;
};
struct Oh_my
: private Base
{
virtual ~Oh_my() {}
};
#include <iostream>
using namespace std;
auto main() -> int
{
Oh_my o;
cout << "C cast: " << ((Base&)o).x << endl;
cout << "reinterpret_cast: " << reinterpret_cast<Base&>(o).x << endl;
}
Выход с MingW g++ в Windows 7:
C cast: 42
reinterpret_cast: 4935184
Но так как это довольно Undefined Поведение, последняя операция вывода может просто сработать.