Исключение - константная строка
От: Аноним  
Дата: 26.04.03 12:31
Оценка:
Подскажите, пожалуйста, как правильнее с точки зрения стандарта отловить следующее исключение:

try
{
    throw "eat this!";
}


Так:

catch( const char* msg )


Или так:

catch( char* msg )


?

Мне почему-то кажется, что первый вариант лучше...
Re: Исключение - константная строка
От: Alexey Shirshov Россия http://wise-orm.com
Дата: 26.04.03 13:02
Оценка:
Здравствуйте, Аноним, Вы писали:

Тебе правильно кажелься, так как строковый литерал имеет тип array of cosnt char или array of const wchar_t, если использован префикс L.
Re[2]: Исключение - константная строка
От: Аноним  
Дата: 26.04.03 20:56
Оценка: -1
Здравствуйте, Alexey Shirshov, Вы писали:

AS>Тебе правильно кажелься, так как строковый литерал имеет тип array of cosnt char или array of const wchar_t, если использован префикс L.


Это не так. То есть, совершенно разумно рассматривать строковый литерал именно таким образом; однако в Си++ по историческим причинам типом строкового литерала является char[] или wchar_t[] (без const).
Re[3]: Исключение - константная строка
От: Андрей Тарасевич Беларусь  
Дата: 26.04.03 21:31
Оценка: 35 (4)
Здравствуйте, Аноним, Вы писали:

AS>Тебе правильно кажелься, так как строковый литерал имеет тип array of cosnt char или array of const wchar_t, если использован префикс L.


А>Это не так. То есть, совершенно разумно рассматривать строковый литерал именно таким образом; однако в Си++ по историческим причинам типом строкового литерала является char[] или wchar_t[] (без const).


Неверно. В C++ тип строкового литерала — именно константный массив символов (именно с 'const'). А "по историческим причинам" для строкового литерала была введена стандартная конверсия к типу 'char*'. К случаю throw/catch эта конверсия никакого отношения не имеет и применяться в этом случае не будет.

Масивы, указанные в качестве аргументов в throw-expression немедленно преобразуются в указатели. Это относится и к строковым литералам. Throw-expression со строковым литералом в качестве аргумента выбрасывает исключение типа 'const char*'. Поймать такое исключение при помощи 'catch (char*)' не получится. Его можно поймать через 'catch (const char*)' или, например, 'catch (const char[])' или 'catch (const char[123])' (все это разные формы записи одного и того же).
Best regards,
Андрей Тарасевич
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.