【问题标题】:`auto` return type in context of class members类成员上下文中的`auto`返回类型
【发布时间】:2017-04-03 08:08:24
【问题描述】:

如何对班级成员使用自动类型扣除?比如下面的代码

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的返回类型是什么而不知道它的定义。

我的问题是,如果函数的声明和定义是分开的,是否有任何解决方法或某种编程模式来规避自动返回类型不能用于类成员函数的问题。

【问题讨论】:

  • 没有。使用返回类型推导时,定义必须可见,然后才能使用(成员)函数。
  • 可以将函数的声明和定义分开。但定义必须在函数使用前可见。
  • 这里不需要“解决方法”,因为没有需要解决的问题。只是不要像那样使用auto

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-04-22
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    相关资源
    最近更新 更多