表达式是否忽略 immutable/const?

is expression ignores immutable/const?

我正在使用函数模板 void _createAttr(T)(args..., in T[]) 并在函数中使用 static if(is(T == char)) 测试 T 的类型。当我打电话时,

_createAttr!char(args...,"someString")
_createAttr(args...,"someString")

编译器从不抱怨。

我当然知道alias string = immutable(char)[]。所以在第一次调用时,T 的类型和提供的参数不匹配,但是 in 修饰符应该处理这个问题。在第二种情况下,它应该推断出 T = immutable(char)。据我了解,immutable(char)char 是不同的类型,但编译器在第二种情况下通过了 is 测试。

编译器 (DMD) 在进行 is 测试时似乎忽略了字符串中字符的不可变性。

我在 dlang.org 或 The D Programming Language 一书中找不到任何关于此行为的解释。

这是编译器错误吗?

没有bug,只是将in限定符扩展为const,对immutable(char)char同样有效,所以编译器只实例化了它一次。

如果 T == char,那么 in T[] 意味着 const char[] 涵盖了这两种情况,因此模板永远不需要考虑不变性。您也可以毫无问题地将可变字符串传递给该函数。

如果你明确地做了 !(immutable(char)) 那么它会使用那个,并且不再接受可变的。