【发布时间】:2019-06-10 00:26:41
【问题描述】:
在使用指向成员的指针时,我遇到了一种行为,这种行为对我来说似乎有点不一致并且有点违反直觉。考虑以下虚拟结构:
struct foo {
int x;
double d;
};
还有以下main():
int main() {
int foo::* ptr = &foo::x;
double foo::* ptr2 = &foo::d;
}
这里我们没有什么异常 - 两个指向 const 成员的指针。代码编译正常。
引起我注意的是,当我们添加const 时,情况发生了一点变化。考虑以下代码:
int main() {
// no int or double after const
const foo::* ptr = &foo::x;
}
代码在 GCC 8.2.01 上编译良好。请注意,我没有指定指针将指向什么数据类型。
但是,这段代码:
int main() {
// notice the only change - "d" instead of "x"
const foo::* ptr = &foo::d;
}
编译失败,出现以下错误:
错误:无法在初始化
const foo::* ptr = &foo::d;中将“double foo::*”转换为“const int foo::*”
这很有趣 - 它表明,默认情况下,const 指向成员的指针被隐式声明为指向某个 int 成员。这是正确的标准行为吗?
值得注意的是,如果我们删除const,这两行都会产生错误:
int main() {
foo::* ptr1 = &foo::x;
foo::* ptr2 = &foo::d;
}
形式为:
错误:“
*”令牌之前的预期不合格 ID错误:'
ptr1' | 'ptr2' 未在此范围内声明
所以问题是 - 如果我们没有另外指定,标准是否指定 const 指向成员的指针隐式指向 int,或者它是非标准行为? (GCC 扩展或 GCC 错误)。
1编辑:我正在使用 MinGW 的 GCC - this 特定版本。
【问题讨论】:
-
"代码在 GCC 8.2.0 上编译得很好" 嗯,不。
-
您是否使用
-fpermissive进行编译?我强烈建议不要这样做。 -
通常当没有给出类型时,假定为 int。我猜这就是为什么它可以工作的原因,或者更确切地说,对于 int,但不是 double。
-
@Chipster 我有其他建议吗?不打算。
-
@Chipster 啊是的,我知道,但是谢谢。
标签: c++ syntax language-lawyer variable-declaration pointer-to-member