Меня часто беспокоит постоянная корректность, и это, похоже, не является исключением. Пожалуйста, сообщите мне, почему следующий код обыкновение компиляции:Невозможно преобразовать параметр - Отклонение от конверсии теряет квалификаторы
class string_token_stream
{
public:
typedef wchar_t* string_type;
string_token_stream(const string_type input_string)
: _input_string(input_string)
{
}
private:
const string_type _input_string;
};
int main(int argc, char **argv)
{
const wchar_t *str = get_a_string_somewhere();
string_token_stream sts(str);
// ^------ Compile-time error C2664.
return 0;
}
ошибка получили в жизни:
error C2664: 'string_token_stream::string_token_stream(const string_token_stream::string_type)' : cannot convert parameter 1 from 'const wchar_t *' to 'const string_token_stream::string_type'
1> Conversion loses qualifiers
Я компиляции на Visual C++ 2010 Express. Дополнительные параметры компиляции/компоновщика доступны по запросу.
«... const игнорируется ...». Не могли бы вы уточнить, почему этот const игнорируется (или не учитывается при преобразовании)? –
@ J.N .: это 'const' в' string_token_stream (const string_type input_string) 'делает' input_string' const, а не то, на что указывает. Если вы попытаетесь присвоить 'input_string' что-нибудь внутри функции, компилятор даст вам ошибку, например,' назначение параметра только для чтения 'input_string''. Я думаю, что это происходит из-за того, что 'const/volatile type' и' type const/volatile' эквивалентны, порядок не имеет значения. –
@ Alex: да, спасибо, я понял это сам, был вопрос, связанный с SO. –