C++ 自动返回类型推断警告:当返回定义类型时,为什么需要decltype?
这是一个关于elementsSize()成员函数如何处理自动返回类型推断的问题:C++ 自动返回类型推断警告:当返回定义类型时,为什么需要decltype?,c++,c++11,c++14,C++,C++11,C++14,这是一个关于elementsSize()成员函数如何处理自动返回类型推断的问题: #include <iostream> #include <vector> template<typename Element> class ElementVector { std::vector<Element> elementVec_; // Other attributes. public: ElementV
#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;
}
我读过关于自动返回类型扣除的选项,该选项在不使用decltype的情况下成为可能
写注释掉的decltype
对我来说似乎有点奇怪。我做错了什么
注意:我知道如果“其他属性”中没有向量,我可以从std::vector继承,这正是我实际问题中的情况 我做错了什么 没什么。GCC4.8实现了自动推断的返回类型,但默认情况下作为C++1y特性启用。使用
-std=c++1y
编译将删除该警告
[答案转换自。]“我知道我可以继承自
std::vector
”——这可能是一个非常糟糕的主意。你回答了自己的问题,必须编写decltype很奇怪,所以C++14正在更改它。我不确定你到底在问什么-你似乎回答了自己的问题。目前,该语言需要一个返回类型,因为对于普通函数(仅针对lambdas),返回类型推导没有进入C++11;因此,您需要给出一个(使用decltype
或其他方法)。如果您有一个支持演绎的编译器(正如您所说,它应该在今年晚些时候成为标准),您可以省略它。@tomislav maric:尾部返回类型可以基于函数参数类型,例如auto add(T1 a,t2b)->decltype(a+b)
。领先的返回类型不能。@SplinterOfChaos:你不应该通过写评论来回答问题。你应该通过写答案来回答问题。
main.cpp:20:27: warning: ‘elementsSize’ function uses ‘auto’ type specifier without trailing return type [enabled by default]
auto elementsSize() // -> decltype(elementVec_size())