【问题标题】:decltype requires instantiated objectdecltype 需要实例化对象
【发布时间】:2012-03-18 17:12:30
【问题描述】:

我对 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&lt;T&gt; v,这违反了我的编码风格。我想在我的公共成员之后声明我所有的私人成员。您必须在函数声明之前声明向量,因为decltype 中的表达式是对向量成员函数begin() 的调用,并且需要对象的实例。

有没有办法解决这个问题?

【问题讨论】:

  • 我想补充一点,我知道没有auto 怎么办,但问题是关于autodecltype 的使用。

标签: c++ coding-style c++11


【解决方案1】:

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

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

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

【讨论】:

  • decltype 方法的强大之处在于它具有正确的this 类型。包括 const 成员函数。
  • 约翰内斯怎么说。如果您不小心并在其中使用 std::declval&lt;const T&gt;(),这对于 const 成员函数将失败。
猜你喜欢
  • 2017-07-23
  • 2019-02-17
  • 2015-07-29
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
相关资源
最近更新 更多