É possível passar um inicializador entre chaves como um parâmetro de macro?

Eu tenho uma função que eu chamo assim:

literal<long[2]>({1, 2});

Quero escrever uma macro que se expanda para esta declaração, por exemplo:

MYMACRO(long[2], {1, 2})

Infelizmente, o pré-processador não está ciente da correspondência entre chaves e vê três argumentos (o segundo e o terceiro são{1 e2}, respectivamente).

Essa é uma limitação conhecida do pré-processador, e a solução mais simples é adicionar parênteses extras, se possível, na chamada de macro.

Mas, nesse caso, colocar o inicializador entre colchetes entre parênteses parece mudar seu significado:

literal<long[2]>(({1, 2}));

(g++ 4.8) error: left operand of comma operator has no effect [-Werror=unused-value]

Isso é um bug do GCC ou foi corrigido por design? Existe alguma maneira de realizar o que eu quero?

Atualizar

Eu provavelmente deveria ter sido mais claro na formulação das perguntas originais. O pré-processador não mudou desde sempre (mesmo as macros variadas são uma extensão do GCC há muito tempo). As soluções práticas nesse caso são úteis, mas também são muito bem conhecidas e não chegam ao ponto em que quero chegar.

Eu realmente quero saber se algo foi adicionado ao C ++ 11 para abordar especificamente esse problema (ou foi um descuido?). O manuseio peculiar de chaves em invocações de macro parece ser um problema muito maior agora, dado o uso amplamente expandido de listas de chaves em todo o idioma.

Estou especialmente aborrecido pelo fato de que colocar parênteses em torno de uma lista de inicializadores entre chaves muda a maneira como é analisado quando usado como parâmetro de função. Existe algum outro parâmetro para uma chamada de função que não possa ser entre parênteses? Parece um caso especial ao escrever macros que passam parâmetros para funções.

Eu realmente espero que alguém possa apontar que isso é um bug do GCC ou explicar por que colocar parênteses em torno de uma lista de inicializadores entre chavesdevo mude seu significado.

questionAnswers(1)

yourAnswerToTheQuestion