本文主要是介绍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,静态函数不能访问变量的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!