Operator overloading - throw

Operator overloading - throw
43
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 6 lat
  • Postów:61
0

Coś mi umyka, ale...
Dlaczego standard nie przewiduje możliwości przeładowania operatora throw, podobnie jak robi to z new oraz delete?

Czy nie istnieje absolutnie żadne przydatne zastosowanie przeładowania throw?
Czy jest to sprzeczne z filozofią wyjątków?

Z góry dzięki za odpowiedzi na to głupie pytanie :)

edytowany 1x, ostatnio: 4ggr35510n
Olamagato
Zawsze byłem przekonany, że throw w C++ to jest instrukcja, a nie operator. :)
msm
Throw nie jest operatorem, niezależnie od tego co na wiki wypisują. Throw jest słowem kluczowym, tak samo jak if albo return.
Endrju
Zgadzam się z przedmówcą, throw to nie operator.
43
A czy to jest link do wiki...? Przeczytajcie cały temat: "Throw can be used to introduce an exception specificaion of a function declaration, in which case, it isn't an operator, or it can be used in an expression, in which case, it is. Except, of course, that this distinctio between operators and other tokens is rather superficial and meaningless." oraz "As far as I can see, the language standard doesn't define operators." itd... + linkują tam do oficjalnego standardu, w przeciwieństwie do Was, szanowni MSM i Endrju :)
Endrju
Cytowanie standardu niewiele pomoże, bo on nigdzie nie określa co to w ogóle jest operator. Jest jedynie napisane, że wyrażenie składa się z operatora i operandów (5.0.1). Throw jest wyrażeniem (15.0.1) i w tym sensie jest operatorem w tym wyrażeniu (co podkreśla 15.1.3). W takim samym sensie operatorem jest w odpowiedniej sytuacji int. W potocznym rozumieniu słowa "operator" throw nim nie jest. Zamiast kategorycznie stwierdzać "throw to nie operator" powinniśmy stwierdzać "ciężko uznać throw za operator taki jak np. new".
msm
@4ggr35510n - jako dowód że throw to operator podano między innymi link do wiki. Ok, wiem że czytanie to niełatwa czynność, szczególnie po północy. W takim razie proszę bardzo, zalinkuję do oficjalnego standardu. (Musiałem uciąć komentarz bo się nie mieścił).
msm
Standard definiuje operator jako jako jeden z kilku rodzajów tokenów (patrz p. 2.6). Rodzaje tokenów to, uwaga, identifier, keyword, literal, operator, punctuators. Teraz zapraszam do spojrzenia na tabelkę w 2.11 - lista keywordów - jest throw. Teraz tabelka w 2.12 - lista operatorów - nie ma throw. Jest jeszcze ktoś kto twierdzi że throw jest operatorem?
Endrju
Problem w tym, że na liście operatorów nie ma też np. sizeof a uznaje się go za operator. (Nie tylko uznaje, standard mówi, że to operator: 5.3.3) Poza tym poczytaj te punkty o których pisałem. Jest napisane (15.1.3) "from the static type of the operand of throw". Operator ma operandy. (Po prostu standard nie jest całkowicie ścisły)
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
0

Bo to po prostu nie ma sensu. To tak, jak byś chciał przeciążyć if - throw to nie jest operator.*

(No pewnie coś się da wymyślić, ale czy to będzie miało sens)

* - ok to nie jest takie oczywiste: http://4programmers.net/Forum/C_i_C++/202964-operator_overloading_-_throw?p=873075#comment-83779


"(...) otherwise, the behavior is undefined".
edytowany 2x, ostatnio: Endrju
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
0

C++ jest już tak pokręconym językiem, że nie wymyślajmy lepiej co miałoby znaczyć przeładowywanie throw lub co gorsza if-a…

…ale żeby było śmiesznie, w C# można przeciążyć operatory true i false, dzięki czemu można sterować zachowaniem m.in. ifa i while'a.

edytowany 1x, ostatnio: Azarien
msm
Akurat true i false to śmieszna część C# (tzn. false jest ciekawe)... Ale może nie będę wypominał tego że w C++ używa się do tego przeciążenia niejawnej konwersji do void* :P
43
I potem kończymy z "delete std::cout;", tak? :P http://www.artima.com/cppsource/safebool2.html
43
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 6 lat
  • Postów:61
0

A czy istnieje jakiś powód, dla którego "to po prostu nie ma sensu"...?

Całe to pytanie wzięło się, mniej więcej, stąd:
http://www.parashift.com/c++-faq/throwing-polymorphically.html

02
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 lat
  • Postów:1176
1

#define throw i masz "przeciążenie" [rotfl]

robcio
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Opole
  • Postów:533
1

Jeśli chcemy przeładować jakąś nazwę czy to funkcji czy operatora mamy na celu zdefiniowanie innego sposobu ich wykonania dla różnych obiektów. throw nie jest nawet operatorem bo nie zwraca żadnej wartości. Mamy takie coś

Kopiuj
		throw obA;
		throw obB;
 

chcemy aby dla obiektu typu A i B wywołanie throw było inne. Zastanówmy się co moglibyśmy zrobić w "funkcji przeładowywującej". Na bank musielibyśmy użyć wewnątrz jej throw i "rzucić dalej obiekt" bo własnej implementacji nie będziemy pisać. Przedtem moglibyśmy zrobić rzeczy związane z konkretnym typem obiektu. Np zmiana jego wartości lub wypisanie jakiejśc informacji na ekranie. Ale przecież to samo mozna by było uzyskać pisząc to po prostu w kodzie.
Np:

Kopiuj
#include <iostream>

class Obiekcik
{
public:
	int a;
};

class Obiekcik2
{
public:
	int b;
};

int main()
{
        
	Obiekcik ob;
	ob.a = 5;

	Obiekcik2 ob2;
	ob2.b = 10;

	try
	{
                std::cout <<"Rzucam ob";
                ob.a = 2345;
		throw ob;

                std::cout <<"Rzucam ob2";
                ob2.b = 543;
		throw ob2;
	}

	catch(Obiekcik & ob)
	{
		std::cout << ob.a << "\n";
	}

	catch(Obiekcik2 & ob)
	{
		std::cout << ob.b << "\n";
	}

	std::cin.get();
}
 

Dlatego właśnie przeładowywanie throw jest bezsensu


Nie odpowiadam na PW z prośbą o pomoc programistyczną.
msm
throw nie jest nawet operatorem bo nie zwraca żadnej wartości - tak w zasadzie to zwraca, bo jest wyrażeniem (expression) a wszystkie wyrażenia mają wartość. Z drugiej strony, jego typ to void, czyli nie ma to większego znaczenia.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.