【发布时间】:2017-11-20 13:59:00
【问题描述】:
当我在结构中包含全局命名空间限定符时尝试使用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);
}
如果我现在将全局命名空间限定符添加到 bar 结构中 chuckle 的参数中:
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) 语言规范中有此原因吗?
【问题讨论】:
-
我怎么错过了这个问题!这么多巴里......