пятница, 10 июля 2009 г.

[prog.bugs] C++: “a” + 2?

Сколько раз в священных войнах по поводу разных языков программирования обсасывался аргумент, что хорошие статически-типизированные языки не позволяют складывать строки с числами? И C++ не самый плохой статически-типизированный язык. Казалось бы, что в нем это невозможно. Однако:

#include <iostream>
#include <string>

int main() {
 std::string a( "1" );
 std::string b( "2" );

 a += b.size();
 std::cout << a << std::endl;
}

Этот код вполне себе работает :( Проверял на Visual C++ 7.1 и GCC 4.3.2. Видимо, size_t автоматически конвертируется к char, после чего вызывает operator+=(char).

Обнаружил эту ситуацию из-за ошибки в коде: скопировал фрагмент и забыл убрать обращение к методу size(). Потом был обескуражен тем, что компилятор мне ничего не сказал по этому поводу.

3 комментария:

Dmitry Vyukov комментирует...

"a" + 2 иногда очень полезно:
for (size_t i = 0; i != 10; i += 1)
std::cout << "," + !i << i;
:)

Dmitry Vyukov комментирует...

Но у тебя тут правда к стрингу прибавляется, что видимо приобретает совсем другой смысл... метаморфозы С++ :)

eao197 комментирует...

В том-то и дело, что уж заподлянок от операторов для std::string я не ожидал.

Но твой пример хорош! Никогда раньше его не видел. Эффект поразительный :)