[VC 7.1 - 10.0 Bug] строковые литералы в выражениях
От: rg45 СССР  
Дата: 10.06.10 14:32
Оценка: 50 (3) :)
Привет всем!

Столкнулся с забавным глюком, который проявляется на всех последних копиляторах MSVC (проверил четыре версии: 7.1, 8, 9 и 10). В выражениях подобных следующему:
"0123456789" + 2

строковый литерал, являющийся константным массивом символов, не преобразуется к указателю. И конечным типом такого выражения по-прежнему является константный массив. И, что самое интересное, размер результирующего массива равен размеру исходного!

Вот пример, подтверждающий этот факт:
#include <iostream>

int main()
{
  std::cout << sizeof("123456789") << std::endl; //Output: 10
  std::cout << sizeof("123456789" + 5) << std::endl; //Output: 10
  
  const char (&a)[10] = "123456789"; //ok
  const char (&b)[10] = "123456789" + 3; //ok
  const char (&c)[10 - 3] = "123456789" + 3; //error C2440: 'initializing' : cannot convert from 'const char [10]' to 'const char (&)[7]'
}

Обратите внимание на сообщение об ошибке!
--
C++ уже затем учить надо, что он ум в порядок приводит. (с) Ломоносов М.В.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.