#include <iostream>
#include <initializer_list>
using namespace std;

struct AddInitializerList {
	void operator+= (initializer_list<int> values) {
		// Do nothing	
	}
	
	void operator+ (initializer_list<int> values) {
		// Do nothing
	}
};

template<class T> auto id(std::initializer_list<T> il) { return il;}
template<class T> auto _ (std::initializer_list<T> il) { return il;}

template<class T> auto operator+(std::initializer_list<T> il) { return il; }

int main() {
	AddInitializerList adder;
	adder += {1, 2, 3};  // Totally legit

	adder.operator+({1, 2, 3});  // okay!
	adder + id({1, 2, 3});
	adder +  _({1, 2, 3});
	
	adder +  operator+({1, 2, 3});

	adder +  {1, 2, 3};  // Not okay!
	
	return 0;
}