decltype需要实例化对象

decltype requires instantiated object

本文关键字:对象 实例化 decltype      更新时间:2023-10-16

我对C++11标准进行了一些实验,发现了这个问题:

在C++11中,您可以使用autodecltype自动获取函数的返回类型,例如下面的begin()end()函数:

#include <vector>
template <typename T>
class Container {
private:
    std::vector<T> v;
public:
    auto begin() -> decltype(v.begin()) { return v.begin(); };
    auto end() -> decltype(v.end()) { return v.end(); };
};

我的问题是,我必须在公共声明之前声明私有vector<T> v,这违反了我的编码风格。我想在我的公共成员之后宣布我的所有私人成员。您必须在函数声明之前声明向量,因为decltype中的表达式是对向量成员函数begin()的调用,并且需要对象的实例。

有办法绕过这个吗?

您可以完全避免使用decltype,只需将返回类型设置为std::vector<T>::iterator

如果你想使用auto,你可以使用std::declval从如下类型中获取值:

auto begin() -> decltype(std::declval<std::vector<T>>().begin()) { return v.begin(); };