【发布时间】:2019-05-13 14:36:46
【问题描述】:
我只是在自己的代码中注意到了这种行为,所以这是一个幼稚的问题:
这个:
struct A
{
int get()
{
return a;
}
int a=1;
};
int main() {}
编译当然没问题,尽管成员数据的声明位于 函数定义之后。
但后来我不明白为什么会这样:
struct A
{
auto get() -> decltype(a)
{
return a;
}
int a=1;
};
不编译(*)。我必须这样写:
struct A
{
int a=1;
auto get() -> decltype(a)
{
return a;
}
};
是否有任何与语言相关的原因导致它不正常,或者仅仅是编译器没有实现它?无论班级成员的顺序如何,我都希望有相同的行为。
(*) 通过 Ideone.com 使用 gcc 6.3 测试
【问题讨论】:
-
编译器在知道它存在之前就无法推断出它的类型
-
两个不同的东西。声明和定义。在类声明完成之前,不会定义类方法。在声明类方法和成员(它们的类型和返回类型)时,通常的规则适用。无法引用尚未声明的内容。
-
但是在第一个 sn-p 中,它确实知道 a,不是吗?
-
它“知道 a”,因为在声明整个类之前,逻辑上没有定义函数的主体。就好像编译器在看到右大括号之前不会处理类方法的主体。
-
请注意类似的事情确实可以编译:
struct A { size_t get() { return sizeof(a); } int a; };
标签: c++ c++11 language-lawyer decltype