Преобразование, которое может обрабатывать 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 Поведение, последняя операция вывода может просто сработать.