2015-11-24 13 views
7

It is said che il cast in stile C tenta semplicemente di applicare una combinazione diversa di cast di C++ e viene utilizzata la prima combinazione consentita. Tuttavia, ho la sensazione di aver sentito che ci sono situazioni in cui solo il cast in stile C può gestire, mentre nessuna combinazione di cast di C++ è consentita.Una conversione che il cast in stile C può gestire, ma i cast di C++ non possono

Mi sbaglio? È vero che qualsiasi cast di tipo C in qualsiasi contesto (in C++) può essere sostituito con una combinazione corretta di cast di C++?

UPD Grazie a Cheers and hth. - Alf, abbiamo un esempio che C++ fusioni non possono gestire nel senso che non possono produrre definito e previsto comportamento. La domanda avanzata è di fornire un esempio che i cast di C++ non possono gestire nel senso che non può essere nemmeno compilato?

+1

"Ho la sensazione che ho sentito che ci sono situazioni in cui solo il cast in stile C può gestire, mentre nessuna combinazione di cast di C++ è consentita" - Sospetto che ciò che hai sentito sia piuttosto che C consente alcuni cast Il C++ no. Questo non ha nulla a che fare con il * significato * di un cast in stile C in termini di cast di C++. Non ho un esempio pratico, tuttavia. –

+0

@JohnBollinger, puoi ancora eseguire lo stesso cast attraverso una combinazione di stili in stile C++. – SergeyA

+0

Ovviamente no, ciò renderebbe il cast di C++ inferiore. – emlai

risposta

11

Il cast su base inaccessibile può essere espresso solo come un cast di stile C (una delle varianti sintattiche). In tale contesto è equivalente a static_cast, che può modificare l'indirizzo, ad eccezione del fatto che static_cast non può accedere alla base.

Esempio:

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; 
} 

Uscita con MingW g ++ in Windows 7:

 
C cast: 42 
reinterpret_cast: 4935184 

Ma dal momento che è il comportamento piuttosto indefinito, l'ultima operazione di uscita potrebbe semplicemente in crash.

+0

Un esempio potrebbe aiutare. Il mio primo pensiero è stato che 'reinterpret_cast' può fare qualsiasi cosa, ma alla fine ho pensato a un caso in cui' reinterpret_cast' potrebbe richiedere l'aritmetica dei puntatori e la conoscenza degli interni del compilatore per funzionare. Era quello che stavi pensando, o hai un esempio ancora migliore? –

+0

Dovrò scriverne uno e prendere un'altra tazza di caffè. Ma ok. :) –

+1

@MooingDuck 'struct A {int i; }; struct B {int i; }; struct C: private A, private B {}; ', quindi fare un cast in stile C da' C * 'a' A * 'o' B * 'funzionerà, mentre un' static_cast' fallirà, e a ' reinterpret_cast' darà il risultato sbagliato per almeno uno di essi. – hvd

Problemi correlati