例如
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; }
};
但我如何让第一个案例起作用?
答案 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; }
};