相关疑难解决方法(0)

具有推导返回类型的函数在定义之前不能使用

给出以下代码:

struct A {
   constexpr static auto e() { return 0; }
   void f(int V1 = e()) { int V2 = e(); }
};
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

error: function 'e' with deduced return type cannot be used before it is defined
   void f(int V1 = e()) { int V2 = e(); }
                  ~~^~~
Run Code Online (Sandbox Code Playgroud)

我的理解是,函数体和默认参数都是完整的类上下文,其中类及其成员定义在这些上下文中被认为是完全定义的。

在函数体内,我使用该函数A::e作为变量的初始值设定项V2。此时没有错误,这使我确信在函数体内,该函数A::e被认为是完全定义的。

在函数参数列表中,我使用了 A::eparameter 的默认参数V1。根据定义,默认参数被视为完整的类上下文。此时,我收到一条错误,指出A::e在定义之前已使用该错误。但根据我的理解,A::e 它被认为是在任何完整的类上下文中定义的。

这对我来说有点奇怪,因为函数体和默认参数是完整的类上下文。我真的没有看到两者之间有任何区别,因为在这两种情况下,成员函数X::e都是完全定义的。

我不确定[dcl.spec.auto]/11 …

c++ language-lawyer c++20

9
推荐指数
1
解决办法
841
查看次数

标签 统计

c++ ×1

c++20 ×1

language-lawyer ×1