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

struct InitListConstructible {
	InitListConstructible() = default;
	
    InitListConstructible(std::initializer_list<int> elems) {
    	// do something
    }
};

InitListConstructible operator+ (InitListConstructible lhs,
                                 InitListConstructible rhs) {
    return {};                                 	
}

void freeFunction(InitListConstructible lhs, InitListConstructible rhs) {
	// Do nothing
}

int main() {
	/* Totally fine - use initializer list constructor. */
	InitListConstructible lhs = { 1, 2, 3 };
	
	/* Totally fine - use overloaded + operator. */
	auto legit = lhs + lhs;
	
	/* Totally fine - second argument constructed from initializer list. */
	freeFunction(lhs, { 1, 2, 3 });
	
	/* Totally fine - explicit call to operator+. */
	auto alsoLegit = operator+ (lhs, { 1, 2, 3 });
	
	/* Not okay - reports error about expected primary-expression. */
	auto error = lhs + { 1, 2, 3 };
	
	return 0;
}