Почему этот код на C ++ компилируется? (string) name = 1; [dубликат]

Лучший (и единственный) метод - установить правильные заголовки HTTP, в частности, следующие: «Истекает», «Последнее изменение» и «Кэш-контроль». Как это сделать, зависит от используемого вами серверного программного обеспечения.

В улучшении производительности и hellip; найдите «Оптимизацию на стороне сервера» для общих соображений и соответствующих ссылок и для «кеша на стороне клиента» для конкретных советов Apache.

Если вы поклонник Улучшение производительности и hellip; (или nginx на простом английском языке), как и я, вы также можете легко настроить его:

location /images { ... expires 4h; }

В приведенном выше примере любой файл из / images / будет кэшироваться на клиенте в течение 4 часов.

Теперь, когда вы знаете правильные слова для поиска (заголовки HTTP «Expires», «Last-Modified» и «Cache-Control»), просто просмотрите документацию используемого веб-сервера.

20
задан Dima 24 July 2009 в 16:18
поделиться

4 ответа

Поскольку строка назначается из char , а int неявно конвертируется в char .

28
ответ дан EFraim 16 August 2018 в 05:44
поделиться
  • 1
    Как получилось, что int неявно литой для последних двух блоков? Что вы имеете в виду, что я не могу вызвать operator = явно? Потому что работает следующее: my_string.operator = («hello world»); – user55417 24 July 2009 в 14:43
  • 2
    Не my_string.operator = (my_number) явный вызов оператора = ? Что я не понимаю здесь? – sbi 24 July 2009 в 14:44
  • 3
    «Как получилось, что int неявно литой для последних двух блоков?» Поскольку в то время как 1234 вписывается в 16 бит и может ли быть char, не каждый беззнаковый int будет вписываться в 16 бит. Как только вы укажете тип с большим диапазоном, чем символ, вы остановили компилятор от неявного значения значения для символа. – Binary Worrier 24 July 2009 в 14:46
  • 4
    Почему вы не можете вызвать оператор = явно? – CsTamas 24 July 2009 в 14:48
  • 5
    Странный. Ваш второй пример отлично компилируется. – EFraim 24 July 2009 в 14:50

Класс std :: string имеет следующий оператор присваивания:

  string & amp;  operator = (char ch);   

Этот оператор вызывается неявным преобразованием unsigned int в char .

В вашем третьем случае, вы используете явный конструктор для создания экземпляра std :: string , ни один из доступных конструкторов не может принять unsigned int или использовать неявное преобразование из unsigned int [ ! d5]:

  string ();  string (const string & amp; s);  string (size_type length, const char & amp; ch);  string (const char * str);  string (const char * str, size_type length);  string (const string & amp; str, size_type index, size_type length);  string (начало ввода входного сигнала, конец ввода);   
21
ответ дан LBushkin 16 August 2018 в 05:44
поделиться
  • 1
    «операторы не могут быть вызваны с использованием функционального синтаксиса вызова». 13.5 (4) в стандарте C ++ говорят, что могут. – Steve Jessop 24 July 2009 в 14:54
  • 2
    «операторы не могут быть вызваны с использованием функционального синтаксиса вызова» Это неправильно. – sbi 24 July 2009 в 14:57
  • 3
    Позор, потому что принятый ответ сначала совершил ту же ошибку, но в любом случае был проголосован, а затем исправлен, тогда как этот ответ в противном случае намного лучше, и его проголосовали. Я проголосую за это, если это исправлено. – Steve Jessop 24 July 2009 в 15:27
  • 4
    По-видимому, я устарел от своих знаний о C ++ :) Я поправлю свой ответ. – LBushkin 24 July 2009 в 15:43

Это вызов operator = (char ch) - мой отладчик вступил в это. И мой MS VS 2005 компилируется следующим образом без ошибок.

  std :: string my_string ("");  unsigned int my_number = 1234;  my_string = my_number;  my_string.operator = (my_number);   
1
ответ дан Stanislav 16 August 2018 в 05:44
поделиться

Я могу объяснить первую и третью ситуации:

  my_string = 1234;   

Это работает, потому что строка имеет переопределенный оператор = (char). Фактически вы назначаете символ (с переполнением данных) в строку. Я не знаю, почему второй случай приводит к ошибке компиляции. Я пробовал код с GCC, и он компилируется.

  std :: string my_string (1234);   

не будет работать, потому что нет конструктора строк, который принимает аргумент char или int.

0
ответ дан Vijay Mathew 16 August 2018 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: