Я читал некоторый код, и я наткнулся на этот пример. Я не понимаю, почему автор использует смещение 1 из обеих переменных в последней строке. На первый взгляд я предполагаю, что это незаконно, потому что это относится к возможно неинициализированной области памяти (и это может вызвать ошибку сегментации). Моя голова говорит мне о неопределенном поведении, но так ли это?Смещение с адреса памяти
static bool lt(wchar_t a, wchar_t b)
{
const std::collate<wchar_t>& coll =
std::use_facet< std::collate<wchar_t> >(std::locale());
return coll.compare(&a, &a+1, &b, &b+1) < 0;
}
Последняя строка - это вопрос. Почему необходимо, чтобы он это делал, это законно, и когда это нужно делать?
collate :: compare принимает ряд символов. Здесь автор использует один объект как диапазон итераторов. [Это совершенно законно] (http://stackoverflow.com/q/9114657/485561). – Mankarse
@Mankarse Адрес аргумента функции + 1 - не является ли это неправильным указателем? Если a и be были указателями, и это было (a, a + 1, b, b + 1), это было бы справедливо; но это выглядит как неопределенное поведение. Я буду ждать тех, кто прочитал спецификации. – Amarghosh
@Amarghosh: Я * имею * прочитал спецификации. См. Связанный QA. '[expr.add]/4: Для целей этих операторов указатель на объект nonarray ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта в качестве его типа элемента.' – Mankarse