История изменений
Исправление thunar, (текущая версия) :
Коммутативность сложения тут не причём, тут отсутствие проверки типов — с кастомным контейнером где [] переопределён такой глупости не будет:
int a[]{1,2,3}, j{0};
struct foo {
int *d;
int& operator [] (int i) const {
return d[i];
}
}x{a};
std::cout<<a[j]<<"\n"; //ok
std::cout<<j[a]<<"\n"; //ok
std::cout<<x[j]<<"\n"; //ok
std::cout<<j[x]<<"\n";
^^ error: no match for ‘operator[]’ (operand types are ‘int’ and ‘main(int, char**)::foo’)
};
Исправление thunar, :
Коммутативность сложения тут не причём, тут отсутствие проверки типов — с кастомным контейнером где [] переопределён такой глупости не будет:
int a[]{1,2,3}, j{0};
struct foo {
int *d;
int& operator [] (int i) const {
return d[i];
}
}x{a};
std::cout<<a[j]<<"\n";
std::cout<<j[a]<<"\n";
std::cout<<x[j]<<"\n";
std::cout<<j[x]<<"\n"; << error: no match for ‘operator[]’ (operand types are ‘int’ and ‘main(int, char**)::foo’)
};
Исправление thunar, :
Коммутативность сложения тут не причём, тут отсутствие проверки типов — с кастомным контейнером где [] переопределён такой глупости не будет:
int a[]{1,2,3}, j{0};
struct foo {
int *d;
int& operator [] (int i) const {
return d[i];
}
}x{a};
std::cout<<a[j]<<"\n";
std::cout<<j[a]<<"\n";
std::cout<<x[j]<<"\n";
std::cout<<j[x]<<"\n"; << error: no match for ‘operator[]’ (operand types are ‘int’ and ‘main(int, char**)::foo’)
};
Исходная версия thunar, :
Коммутативность сложения тут не причём, тут отсутствие проверки типов — с кастомным контейнером, где [] переопределён такой глупости не будет:
int a[]{1,2,3}, j{0};
struct foo {
int *d;
int& operator [] (int i) const {
return d[i];
}
}x{a};
std::cout<<a[j]<<"\n";
std::cout<<j[a]<<"\n";
std::cout<<x[j]<<"\n";
std::cout<<j[x]<<"\n"; << error: no match for ‘operator[]’ (operand types are ‘int’ and ‘main(int, char**)::foo’)
};