c++ - `auto` 类成员上下文中的返回类型

标签 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 的返回类型是什么。

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

最佳答案

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

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

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

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

关于c++ - `auto` 类成员上下文中的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40694607/

相关文章:

c++ - 移除对 boost::filesystem::current_path() 的依赖

C++ Lambda 没有 operator()

c++ - 如何解析变量和函数引用(链接器和编译器)?

c++ - 关闭后等待文件删除

c++ - 如何使用 Cocoa 或 C++ 在 Mac OS X 中截屏

c++ - 将二维 vector 初始化为类变量 C++

c++ - 如何使用大小未知的 boost::array 作为对象变量

c++ - 为什么 gcc 警告使用 std::tuple 和虚拟继承调用非平凡的移动赋值运算符?

c++ - 将一个命名空间数据成员访问到另一个

c++ - 如何从 C 调用 C++ 方法?