Подтвердить что ты не робот

Используя decltype для получения типа выражения, без const

Рассмотрим следующую программу:

int main ()
{
    const int e = 10;

    for (decltype(e) i{0}; i < e; ++i) {
        // do something
    }
}

Это не скомпилируется с clang (а также gcc):

decltype.cpp:5:35: error: read-only variable is not assignable
    for (decltype(e) i{0}; i < e; ++i) {
                                  ^ ~

В принципе, компилятор предполагает, что i должен быть const, поскольку e есть.

Можно ли использовать decltype, чтобы получить тип e, но удалить спецификатор const?

4b9b3361

Ответ 1

Я предпочитаю auto i = decltype(e){0}; для этого. Это немного проще, чем использование type_traits, и я чувствую, что он более явно указывает намерение, что вы хотите, чтобы переменная, инициализированная значением 0 из e.

Я использую Herb "AAA Style" в последнее время, так что это может быть просто смещение с моей стороны.

Ответ 2

Используйте std::remove_const:

#include<type_traits>
...
for (std::remove_const<decltype(e)>::type i{0}; i < e; ++i)

Ответ 3

Я предпочитаю диапазон. Имитировать это очень просто.

#include <iostream>

template< typename T >
struct range_t
{
    struct iter
    {
        T operator * ()const noexcept { return n;}
        iter& operator ++()noexcept{ ++n; return *this;}
        friend
        bool operator != (iter const& lhs, iter const& rhs)noexcept
        { return lhs.n != rhs.n;}

        T n;
    };

    iter begin()const noexcept {return {b};}
    iter end() const noexcept{ return {e};}
    T b, e;
};
template< typename T > range_t<T>  range(T b, T e){ return {b,e}; }

int main()
{
    const int e = 10;

    for( auto i : range(0,e) )
    {
        std::cout << i << ' ';
    }
    return 0;
}