LINUX.ORG.RU

История изменений

Исправление 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’)
};