2010-09-27 5 views
9

wszystkim: to jest cytat z Effective C++ 3-ty editiionPytanie o const_cast w C++

const_cast jest zazwyczaj używany do odrzucili constness obiektów. Jest to jedyna obsada w stylu C++, która może to zrobić.

Moje pytanie brzmi czy const_cast może dodać constness do obiektu niestałego? Właściwie napisałem mały program próbujący zatwierdzić moją myśl.

class ConstTest 
{ 
public: 

void test() { 
    printf("calling non-const version test const function \n"); 
} 

void test() const{ 
    printf("calling const version test const function \n"); 

} 

}; 
int main(int argc,char* argv){ 
ConstTest ct; 
const ConstTest cct; 
cct.test(); 
const_cast<const ConstTest&>(ct).test();//it is wrong to write this statement without the '&',why 

} 

Pominięcie '&' związana jest z ponoszeniem błąd poniżej:

błędu C2440: 'const_cast': nie można przekonwertować z 'ConstTest' do 'const ConstTest'

pokazuje, że const_cast może dodać constness, ale wydaje się, że musisz rzutować na referencję do obiektu, jaka jest magia tego odniesienia?

+0

Dlaczego chcesz użyć const_cast, aby dodać const? Po prostu przypisz obiekt stały do ​​stałej stałej i gotowe. Nie mam pojęcia, dlaczego odnośnik do konstytucji działa w twoim przypadku. –

+2

Załóżmy, że funkcja składowa ma const i non-const override: w jaki sposób wywołać zastąpienie const dla obiektu niestałego bez wykonywania kopii?(Odpowiedź brzmi "static_cast", ale nie jest od razu jasne, dlaczego 'const_cast' nie powinno również działać w tym przypadku) –

+0

@ Tyler: rzutujesz na referencję do const, na przykład z' static_cast'. –

Odpowiedz

6

Nie trzeba const_cast dodać constness:

class C; 
C c; 
C const& const_c = c; 

Innym sposobem wokół potrzebuje const_cast chociaż

const C const_c; 
C& c = const_cast<C&>(const_c); 

ale zachowanie jest niezdefiniowane, jeśli spróbujesz użyć operacji na const c.

Nawiasem mówiąc, jeśli nie używać odniesienie, kopia obiektu ma być wykonana:

C d = const_c; // Copies const_c 
+0

Mimo to dodanie 'const' _sometimes_ jest przydatną rzeczą do zrobienia, ponieważ pozwala na bardziej zwięzły kod niż poprzez dodanie dodatkowej (referencyjnej) zmiennej. Zobacz dolną połowę tej strony: http://books.google.de/books?id=mT7E5gDuW_4C&pg=PA188. Zauważ, że może, jak [poprawnie zaznaczono sharptooth] (http://stackoverflow.com/questions/3803521/question-about-const-cast-in-c/3803545#3803545), używaj tylko do rzutowania na 'const '_reference_. – sbi

+0

dlaczego odrzucanie stałej const_c jest niezdefiniowane? Co jeśli jest to wbudowany typ, tj. char, int, bool, etc? – Tracy

+0

Zachowanie nie jest niezdefiniowane, chyba że spróbujesz użyć odwołania non-const do modyfikacji obiektu const. –

2

const_cast może być używany tylko do oddania do wskaźników i referencji. Nie można go używać do rzutowania na obiekty. Oto dlaczego: jeśli masz obiekt const, nie możesz go ustawić jako niestały i na odwrót - to już jest const, nie możesz go redeclare. Możesz próbować uzyskać do niego dostęp tylko za pomocą wskaźnika lub odniesienia bez (lub z) const.

1

const_cast Nie można zmodyfikować stałości wartości. Więc zwraca referencję do wartości stałej.

2

const_cast może być również użyty do dodania constness.

$5.2.11/3 - "For two pointer types T1 and T2 where 

T1 is cv1 , 0 pointer to cv1 , 1 pointer to . . . cv1 ,n − 1 pointer to cv1 ,n T 
and 
T2 is cv2 , 0 pointer to cv2 , 1 pointer to . . . cv2 ,n − 1 pointer to cv2 ,n T 

where T is any object type or the void type and where cv1 ,k and cv2 ,k may be different cv-qualifications, an rvalue of type T1 may be explicitly converted to the type T2 using a const_cast. The result of a pointer const_cast refers to the original object. 

Rozważmy:

int *t1 = NULL; // T = int, cv1, 0 = none 
int * const t2 = const_cast<int * const>(t1); // T = int, cv2, 0 = const 

Zgodnie cytat powyżej, powyższe jest w porządku, a to dodaje constness do t

Ale jak Herb Sutter mówi, to prawdopodobnie nie jest wymagane wyraźnie do zrobienia w większości przypadków.

+0

Czytałem sporo książek, żaden z nich nigdy nie wspomniał o użyciu const_cast, aby dodać constness do obiektu lub odniesienia do obiektu? Jednak napotkam to przy użyciu static_cast, aby osiągnąć to samo, co wprowadzone w Effective C++ przez Scott Meyers.OOPS, nie można połączyć z książką google – Tracy

+0

@Tracy: http://lookdit.wordpress.com/2010/05/27/ c-common-knowledge-by-stephen-c-dewherst/(Sprawdź element 9) – Chubsdad