表达式是否忽略 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))
那么它会使用那个,并且不再接受可变的。
我正在使用函数模板 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))
那么它会使用那个,并且不再接受可变的。