У меня есть очень простой код, который отказывается компилировать:Спасаясь от «Inout ад»
struct Wrapper(T)
{
T t;
bool opEquals(inout(Wrapper) other) inout
{
return t == other.t;
}
bool opEquals(inout(T) val) inout
{
return t == val;
}
}
struct Test
{
bool opEquals(Test t)
{
return true;
}
}
void main()
{
Wrapper!Test a, b;
assert(a == b);
//Error: inout method Test.opEquals is not
//callable using a mutable object
assert(a == Test());
}
Теперь, я знаю эту проблему, которая является то, что Test
не определен inout
opEquals
. Однако определение другой изменчивой версии opEquals
в Test
не устраняет эту проблему, поскольку компилятор просто игнорирует ее и вызывает версию inout
независимо. Есть ли способ решить эту проблему, не прибегая к определению перегрузки opEquals
для изменчивого, const
и immutable
?
Ваш второй метод 'opEquals' в' Wrapper' указан неверно. Кроме того, поскольку 'opEquals' не изменяет свой аргумент, вы можете просто сделать его' const', и он будет работать как с изменяемыми, так и с неизменными типами. –
Я считаю, что проблема заключается в том, что я отмечен 'Wrapper.opEquals' как' inout', а не потому, что аргумент помечен как 'inout'. Удаление 'inout' из метода заставляет его компилироваться, но тогда это не сработает, если я создам' immutable' или 'const'' Wrapper'. – Meta
Он работает, если вы создаете 'opEquals' const, который вы должны делать так или иначе, потому что' opEquals' не должен ничего изменять. http://dpaste.dzfl.pl/6cab4a419488 –