本文主要是介绍2401d,静态函数不能访问变量,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原文
嘿,伙计们,为什么最后一行会产生编译错误
?
import std.stdio;
struct S
{static void foo(alias len)(){writeln(len);}
}
void S_foo(alias len)()
{writeln(len);
}
void main()
{const five = 5;S_foo!five;//好,S.foo!five; //错误
}
错误略
.
在我看来,这应该可工作.
谢谢!
似乎因为你把static
写入成员函数
签名中,编译器认为不应允许该函数
可从foo
访问const5
的隐藏参数
.
乍一看,似乎应该允许它,因为static
表明"不访问成员函数
的外围类型或函数
".
但仔细想想,函数模板
是同名模板
的简写.重写代码
为:
struct S
{template foo(alias len){static void foo(){writeln(len);}}
}
在重写中,你是在访问静
应阻止的外部域
.
另一方面,如果把模板
移出结构
,你说这仍有效,但不应该.编译器需要修复
一些内容,但我不太确定哪些.
问题是这里的"静
".要从此函数
体访问main()
的环境,必须有环境指针
;但"静
"排除了.
这两个调用
并不等效.为了等效
,你也需要S_foo
为静
,否则在主域
中实例化S_Foo
,证明:
import std.stdio;
struct S
{static void foo(alias len)(){writeln(len);}
}
static void S_foo(alias len)()
{writeln(len);
}
void main()
{const five = 5;S_foo!five;//现在也错误了S.foo!five; //错误
}
因此,按别名
传递的内容
也需要是静
的.
但坦率地说,我同意这不好
.大约有20
个与此相关的错误报告.未充分描述非静S_foo
的行为.
要绕过,可在结构
中为外部函数
添加别名
:
struct S
{alias foo = S_foo;
}
不太理想,但至少有效
.
这篇关于2401d,静态函数不能访问变量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!