1

例如

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

以上得到编译错误,因为 m_count indecltype无法识别。如何解决它?必须使用autoreturn 和 get 类型 from 。m_count

更改顺序时编译代码

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

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

4

2 回答 2

3

尾随返回类型是成员函数声明的一部分,而不是成员函数定义( [dcl.fct]/2 )。这就是为什么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;        
};
于 2014-12-09T04:17:19.567 回答
2

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

struct A
{
    int m_count;
    auto count() -> decltype(m_count) { return m_count; }
};
于 2014-12-09T04:03:23.537 回答