начать с подчеркивания. Кроме того, другой ответ уже предложил литералы - почему бы не принять тот?

аружил тревожное несоответствие междуstd::string и строковые литералы в C ++ 0x:

#include <iostream>
#include <string>

int main()
{
    int i = 0;
    for (auto e : "hello")
        ++i;
    std::cout << "Number of elements: " << i << '\n';

    i = 0;
    for (auto e : std::string("hello"))
        ++i;
    std::cout << "Number of elements: " << i << '\n';

    return 0;
}

Выход:

Number of elements: 6
Number of elements: 5

Я понимаю механику того, почему это происходит: строковый литерал на самом деле представляет собой массив символов, который содержит нулевой символ, и когда для циклических вызовов используется диапазон.std::end() на массиве символов он получает указатель за концом массива; поскольку нулевой символ является частью массива, он, таким образом, получает указатель после нулевого символа.

Тем не менее, я думаю, что это очень нежелательно: конечноstd::string и строковые литералы должны вести себя одинаково, когда дело доходит до свойств, таких же базовых, как их длина?

Есть ли способ устранить это несоответствие? Например, можетstd::begin() а такжеstd::end() быть перегружен для символьных массивов, так что диапазон, который они разделяют, не включает завершающий нулевой символ? Если так, то почему это не было сделано?

РЕДАКТИРОВАТЬДля того, чтобы оправдать мое возмущение тем, кто сказал, что я просто страдаю от последствий использования строк в стиле C, которые являются «устаревшей функцией», рассмотрим код, подобный следующему:

template <typename Range>
void f(Range&& r)
{
    for (auto e : r)
    {
        ...
    }
}

Вы ожидаетеf("hello") а такжеf(std::string("hello")) сделать что-то другое?

Ответы на вопрос(6)

Ваш ответ на вопрос