当类成员参与c ++ 11时,如何使用auto return和decltype?

时间:2014-12-09 03:47:25

标签: c++ c++11 auto decltype trailing-return-type

例如

struct A
{
    auto count() -> decltype(m_count) { return m_count; }
    int m_count;        
};

以上内容会出现编译错误,因为无法识别decltype中的m_count。如何解决它? auto返回并获取m_count必须使用的类型。

代码在订单更改时编译

struct A
{
    int m_count;        
    auto count() -> decltype(m_count) { return m_count; }
};

但我如何让第一个案例起作用?

2 个答案:

答案 0 :(得分:3)

尾随返回类型是成员函数声明的一部分,而不是成员函数定义 [dcl.fct] / 2 < / EM> )。这就是为什么即使数据成员遵循成员函数定义,也可以在函数体中使用m_count的原因。

但是,在声明中使用时,必须在使用之前声明有问题的名称。

§3.4.1/ 7 [basic.lookup.unqual]

  

在成员函数体或嵌套类定义之外的类X的定义中使用的名称应以下列方式之一声明:
   - 在类X中使用之前或作为X(10.2)基类的成员,或者
   - ...

在您的情况下,您需要将m_count的声明置于count()之前;或者,如果您可以访问C ++ 14编译器,则可以完全省略尾随返回类型。

struct A
{
    auto count() { return m_count; } // OK in C++14
    int m_count;        
};

答案 1 :(得分:2)

在C ++中,您可以使用在声明中引入(声明)的名称,包括decltype中的尾随返回类型。所以你必须重新排序你的声明:

struct A
{
    int m_count;
    auto count() -> decltype(m_count) { return m_count; }
};