自动返回类型推导时的警告:既然返回已经定义了类型,我们为什么还需要decltype?

9
这是一个关于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()) 

我已经了解到,在不使用decltype的情况下,C++14 可以实现自动返回类型推断的选项。
对我来说,注释掉的decltype写起来有些奇怪。我做错了什么吗?
注意:如果在“其他属性”中没有向量,这正是我的实际问题所在,我知道我可以从std::vector继承。

1
我知道我可以从std::vector继承,但这可能是一个非常糟糕的想法。 - Shoe
1
你已经回答了自己的问题,写上 decltype 是很奇怪的,因此 C++14 引入了相应的改变。 - Marc Glisse
@MikeSeymour:好的,所以我应该只是使用decltype编码,并在gcc更新到C++14时立即清理它? - tmaric
1
@tomislav-maric:尾置返回类型可以基于函数参数类型,例如 auto add(T1 a, T2 b) -> decltype(a+b)。但是前置返回类型不行。 - Mike Seymour
1
@SplinterOfChaos:你不应该通过写评论来回答问题,而是应该通过写回答来回答问题。 - Lightness Races in Orbit
显示剩余8条评论
1个回答

17

我做错了什么?

没有。GCC 4.8实现了自动推断返回类型,但作为一个启用的默认C++1y功能。使用-std=c++1y编译将消除该警告。

[答案从此评论转换而来。]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接