Rzutowanie, const_cast i tablice

0

Witam, mam następujacy problem. Ćwiczenie polega na stworzeniu dwóch tablic z modyfikatorami const oraz volatile, a później pozbyciu się ich za pomocą const_cast.

#include <iostream>
using namespace std;

int main(void){
	const double tab1[10]={1,2,3,4,5,6,7,8,9,10};
	volatile double tab2[10]={1,2,3,4,5,6,7,8,9,10};
	for(int i=0;i<10;++i){
		const_cast<double*>(tab1+i);
		const_cast<double*>(tab2+i);
	}
	return 0;
} 

Nie wiem dlaczego ale to nie działa : O Kompilator w obu linijkach gdzie jest const_cast daje ostrzeżenia:
" warning: statement has no effect [-Wunused-value]"
Byłbym wdzięczny za podpowiedź co może być błędem, z góry dziekuje.

1

To co robisz jest bez sensu.

const_cast to bardzo dziwny twór, który służy głównie do godzenia starego kodu z C z nowym kodem C++. Np. mamy funkcję, która przyjmuje char * ale nie modyfikuje go. Powinna przyjmować const char *, ale ktoś napisał ją milion lat temu i nie pomyślał. My musimy ją wykorzystać w kodzie C++, gdzie chcemy móc przesłać do niej jakikolwiek napis - w tym const char *. Tutaj wykorzystuje się const_cast - wiemy, że funkcja nie modyfikuje napisu więc bezpiecznie możemy zdjąć const i napis wysłać. const_cast nie powoduje, że coś co jest const można zmieniać - jeżeli jest const, to zmieniać nie można, próba zmiany (nawet po const_cast) to UB (C++11: 7.1.6.1.4).

Ja bym dał taki przykład:

#include <iostream>
 
void dumb_function(int *array, std::size_t n) {
  for (std::size_t i = 0; i < n; ++i) {
    std::cout << array[i] << ' ';
  }
}
 
int main() {
  const int tab[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  
  dumb_function(const_cast<int *>(tab), 10);
  
  return 0;
}

Funkcja dumb_function tylko wyświetla tablicę, ale jest niedobrze napisana i przyjmuje jedynie int *. Żeby móc wysłać naszą tablicę należy użyć const_cast.

O innym dziwnym zastosowaniu tego operatora możesz poczytać tutaj: http://www.drdobbs.com/cpp/volatile-the-multithreaded-programmers-b/184403766

0

a później pozbyciu się ich za pomocą const_cast.

Co rozumiesz poprzez "pozbycie się ich"?
Pierwsza jest umieszczana w sekcji danych, zatem nie możesz jej usunąć, druga zapewne podobnie.

0

Przez "pozbycie się ich" miałem na myśli pozbycie się modyfikatorów const i volatile, czyli np. żeby wartości w tablicy tab1 mogły być modyfikowane, ale już dowiedziałem się z powyższego postu, że const_cast do tego nie służy.

1

const_cast<double*>(tab1+i);

To nic nie robi.
Jak już, to

double* tab1a = const_cast<double*>(tab1+i);

const_cast nie zdejmuje consta z istniejącego wskaźnika, tylko zwraca nowy, wskazujący na ten sam obszar pamięci, tylko bez consta.

1 użytkowników online, w tym zalogowanych: 0, gości: 1