在类成员的上下文中,`auto`返回类型

时间:2016-11-19 15:29:36

标签: c++ class c++14 auto

如何为班级成员使用自动类型扣除?例如,以下代码

struct A
{
  auto foo(); // foo is defined in another file 
};


int main()
{
  A a;
  a.foo();
}

其中foo的返回类型为auto会导致以下错误:

error: function 'foo' with deduced return type cannot be used before it is defined
  a.foo();
    ^

错误是可以理解的,因为编译在不知道其定义的情况下无法知道foo的返回类型。

我的问题是,如果有任何变通方法或某种编程模式来规避问题,那么自动返回类型不能用于类成员函数,以防函数的声明和定义被分开。 / p>

1 个答案:

答案 0 :(得分:11)

如果要使用返回类型扣除,则不能将声明和定义分隔为不同的文件(除非每个人都包含两者)。除了使用实际类型之外,没有其他解决方法。

当C ++去编译调用func的代码时,它必须能够知道当时,它将返回什么。如果没有在该翻译单元中定义,编译器就无法知道将返回什么。因此,编译器无法编译该代码。而C ++的编译模型不允许它以这种方式使用来自其他翻译单元的信息。

你可以做的最好的事情就是等待模块,这可能会解决这个问题。

不要将返回类型推断视为永远不必编写返回类型的方法。它是一种功能,适用于返回类型难以编写的情况,其中最合理的编写方式是decltype(expr),而expr是您要返回的确切表达式。这些情况通常都是模板代码,无论如何都必须进入标题。如果返回类型对您来说简单明了,那么就没有理由把它放在那里。默认情况下不要使用返回类型扣除。