Предупреждение об автоматическом выводе типа возвращаемого значения: зачем нам decltype, когда return все равно определяет тип?

Это вопрос о том, что делать для функции-члена elementsSize () относительно автоматического вывода типа возвращаемого значения:

#include <iostream>
#include <vector>

template<typename Element>
class ElementVector
{
    std::vector<Element> elementVec_;  

    // Other attributes.

    public: 

        ElementVector() = default; 

        ElementVector(const std::initializer_list<Element>& list)
            :
                elementVec_(list)
        {}

        auto elementsSize() // -> decltype(elementVec_size()) 
        {
            return elementVec_.size(); 
        }
};

using namespace std;

int main(int argc, const char *argv[])
{
    ElementVector<double> e = {1.2, 1.3, 1.4, 1.5};  

    cout << e.elementsSize() << endl;

    return 0;
}

Приведенный выше код приводит к предупреждению компилятора (gcc 4.8.2):

main.cpp:20:27: warning: ‘elementsSize’ function uses ‘auto’ type specifier without trailing return type [enabled by default]
         auto elementsSize() // -> decltype(elementVec_size()) 

Я читал о возможности автоматического определения типа возвращаемого значения для C ++ 14 без использования decltype.

Написание закомментированного decltype мне почему-то кажется странным. Что я делаю неправильно?

Примечание: я знаю, что могу унаследовать от std :: vector, если среди «Других атрибутов» нет вектора, что в точности соответствует моей реальной проблеме.


person tmaric    schedule 21.01.2014    source источник
comment
Я знаю, что могу унаследовать от std::vector - наверное, это очень плохая идея.   -  person Shoe    schedule 21.01.2014
comment
Вы ответили на свой вопрос, было странно писать decltype, поэтому C ++ 14 меняет его.   -  person Marc Glisse    schedule 21.01.2014
comment
Я не совсем понимаю, о чем вы спрашиваете - похоже, вы отвечаете на свой вопрос. На данный момент языку требуется возвращаемый тип, поскольку вывод типа возвращаемого значения не вошел в C ++ 11 для обычных функций (только для лямбда-выражений); так что вам нужно дать один (используя decltype или иначе). Если и когда у вас есть компилятор, поддерживающий дедукцию (который, как вы говорите, должен стать стандартом позже в этом году), вы можете его опустить.   -  person Mike Seymour    schedule 21.01.2014
comment
@Jefffrey: вообще-то эту опцию я позаимствовал у boost.geometry. Проверьте boost / geometry / multi / geometries / multi_polygon.hpp   -  person tmaric    schedule 21.01.2014
comment
@MikeSeymour: хорошо, поэтому мне нужно просто написать код с decltype и очистить его, как только gcc обновится до C ++ 14?   -  person tmaric    schedule 21.01.2014
comment
@ tomislav-maric: Да. Или, может быть, просто используйте size_t.   -  person Mike Seymour    schedule 21.01.2014
comment
@MikeSeymour: еще один вопрос - в чем сейчас преимущество auto + decltype v.s. typedef size_type и соответствующий возврат?   -  person tmaric    schedule 21.01.2014
comment
@Jefffrey template ‹typename Polygon, template‹ typename, typename ›class Container = std :: vector, template ‹typename› class Allocator = std :: allocator› class multi_polygon: public Container ‹Polygon, Allocator ‹Polygon›› {BOOST_CONCEPT_ASSERT (( concept :: Polygon ‹Polygon›)); };   -  person tmaric    schedule 21.01.2014
comment
@ tomislav-maric: Конечные возвращаемые типы могут быть основаны на типах параметров функции, например auto add(T1 a, T2 b) -> decltype(a+b). Ведущие возвращаемые типы не могут.   -  person Mike Seymour    schedule 21.01.2014
comment
@MikeSeymour, хорошо, ясно. Большое спасибо!   -  person tmaric    schedule 21.01.2014
comment
@ tomislav-maric ну, это не меняет того факта, что это плохая идея. Деструктор std::vector не объявлен virtual. Вы знаете, что это значит?   -  person Shoe    schedule 21.01.2014
comment
@Jefffrey: неопределенное поведение, когда объект класса, производного от std :: vector, уничтожается при размещении в куче с использованием указателя на базу (std :: vector), верно? что, если я просто хочу адаптировать векторный интерфейс к своим потребностям, не заставляя меня переписывать весь общедоступный интерфейс для std :: vector? Если у меня нет дополнительных атрибутов в адаптере, все должно быть в порядке, не так ли?   -  person tmaric    schedule 21.01.2014
comment
@SplinterOfChaos: Вы не должны отвечать на вопросы, оставляя комментарии. Вам следует отвечать на вопросы, написав ответы.   -  person Lightness Races in Orbit    schedule 15.05.2014


Ответы (1)


Что я делаю неправильно?

Ничего такого. GCC 4.8 реализует автоматически выводимые типы возвращаемых данных, но как включенную по умолчанию функцию C ++ 1y. Компиляция с -std=c++1y удалит это предупреждение.

[Ответ преобразован из этот комментарий.]

person Community    schedule 15.05.2014