gpt4 book ai didi

c++ - 使用带有指向数据成员的指针的全局命名空间限定符

转载 作者:IT老高 更新时间:2023-10-28 12:45:35 24 4
gpt4 key购买 nike

我在尝试使用 pointer to data member 时遇到编译错误在结构上包含全局命名空间限定符时。我已将代码简化为以下,有效:

namespace foo {
using sausage = int;
struct bar { sausage baz; };
}

auto chuckle(foo::bar barry, ::foo::sausage foo::bar::*paul) {
return barry.*paul;
}

int main() {
return chuckle(foo::bar{5}, &foo::bar::baz);
}

如果我现在将全局命名空间限定符添加到 chuckle 参数中的 bar 结构中:

auto chuckle(foo::bar barry, ::foo::sausage ::foo::bar::*paul) {
// ^~ added ::
return barry.*paul;
}

...然后它不再编译并失败并出现以下错误:

10 : <source>:10:37: error: 'foo::sausage' is not a class, namespace, or enumeration
auto chuckle(foo::bar barry, ::foo::sausage ::foo::bar::*paul) {
^~~~~~~
10 : <source>:10:57: error: expected identifier before '*' token
auto chuckle(foo::bar barry, ::foo::sausage ::foo::bar::*paul) {
^
<source>: In function 'auto chuckle(foo::bar, int*)':
11 : <source>:11:17: error: 'paul' cannot be used as a member pointer, since it is of type 'int*'
return barry.*paul;
^~~~
<source>: In function 'int main()':
15 : <source>:15:45: error: cannot convert 'foo::sausage foo::bar::* {aka int foo::bar::*}' to 'int*' for argument '2' to 'auto chuckle(foo::bar, int*)'
return chuckle(foo::bar{5}, &foo::bar::baz);
^

我在 MSVC、Clang 和 GCC 中看到了这种行为。

我把这两个例子都放在了 Godbolt 上:

问题

a) 为什么添加全局命名空间限定符会导致编译失败?

b) 语言规范中有此原因吗?

最佳答案

微妙的问题!

编译器不考虑额外的空格,所以你的代码实际上是:

auto chuckle(foo::bar barry, ::foo::sausage::foo::bar::*paul)

...当然,这没有意义。您需要用括号消除歧义:

auto chuckle(foo::bar barry, ::foo::sausage (::foo::bar::*paul))
// ^ ^

...一切都很好。

如果你没有在括号里,@Paula_plus_plus你有没有覆盖一个虚拟属性,它实际上可以是空的 @T.C.有用地指出:

auto chuckle(foo::bar barry, ::foo::sausage [[]] ::foo::bar::*paul)
// ^^^^

编译器需要默默地忽略它,但它确实为解析器解决了问题。

关于c++ - 使用带有指向数据成员的指针的全局命名空间限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47393773/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com