0
点赞
收藏
分享

微信扫一扫

d这段代码破坏编译器


​​原文​​​ 即使未定义​​dsds​​和​​sadsad​​,此代码也可以编译.

import std.typecons :;

sadsad executeFunction(Mtypes...)(dstring func, Tuple!(Mtypes) args)
{
static foreach(type; typel.keys)
{
mixin(typel[type] ~ " ret"d ~ type ~ ";");
}

dstring returnType = "Number"d;

Switch: final switch(returnType)
{
static foreach(type; typel.keys)
{
case type:
mixin("alias ret = ret"d ~ type ~ ";");
break Switch;
}
}
dsds ret;
return ret;
}

如下编译:

import std;

auto nonsense(T)(T t) {
return 5+"six";
}

void main() {
}

有​​Mtypes​​​可变模板参数.尽管如此,我相信​​应该​​​在编译时检测到,就像在​​单元测试​​​中那样.
如果​​​从不​​​实例化模板,则它永远不会成为​​可执行​​​文件.它是否在​​生产​​​中并不重要,与​​测试​​​无关.它​​不存在​​​.如果编译器不知道​​Mtypes​​​是什么,它如何发现问题?
对​​​模板​​参数都是如此.考虑一下:

import std.stdio;

T derp(T)(T val) {
val += 10;
return val;
}

void main()
{
writeln("Hello D");
}

​derp​​​显然不适合每种类型.但是这段代码可以编译,因为从未实例化​​derp​​​.​​编译器​​​无法检查​​derp​​​中代码是否​​有效​​​,因为它不知道​​T​​​是什么.如果是​​int​​​的话,那就没问题了.如果是​​string​​则没办法:

void main()
{
writeln(derp!string("No way"));
}

现在,报错.


举报

相关推荐

0 条评论