给出以下代码:
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都是完全定义的。