假设我们有两个成员函数:
我们想在foo()中调用bar():
> cat test.cpp
class a
{
public:
auto foo()
{
auto a = bar();
}
private:
auto bar()
{
return 1;
}
};
> g++ test.cpp -std=c++14
test.cpp:6:12: error: function 'bar' with deduced return type cannot be used before it is defined
auto a = bar();
^
test.cpp:9:7: note: 'bar' declared here
auto bar()
^
这是否意味着我必须在public foo()之前定义 private bar()来完成编译?
但我过去常常在私人成员之前定义公众成员 ......
是否会改进解析器以允许在定义之前调用auto function()
?
答案 0 :(得分:3)
标准说(第7.1.6.4节):
如果需要具有未减少占位符类型的实体类型来确定表达式的类型,则程序格式不正确。
此规则有助于防止循环依赖类型。
例如,如果根据局部变量foo
以某种方式推断出a
的返回类型会发生什么,并且bar
的返回类型涉及调用foo()
?也许有许多不同类型的选择会完全一致......编译器无法选择一种。因此,它需要在需要之前推导出返回类型(通过查看函数体内的return语句)。