Como o C++20 nos deu lambdas em contexto não avaliado, posso escrever o seguinte código.
template <class = decltype([]{})>
class MyType {};
Se eu incluísse essa definição em várias TUs, isso seria uma violação do ODR?
Estou analisando em particular o §6.3(13.13) do N4860:
Em cada uma dessas definições, [...] um argumento de modelo padrão usado por um template-id (implícito ou explícito) ou simple-template-id é tratado como se sua sequência de tokens estivesse presente na definição de D; ou seja, o argumento padrão ou argumento de modelo padrão está sujeito aos requisitos descritos neste parágrafo (recursivamente).
que eu li como, decltype([]{})
é parte do tipo declarado, que é então um exemplo explicitamente rotulado como inválido pelo artigo original (§4). Estou lendo isso corretamente?
Edição 1: aqui está outra citação do mesmo parágrafo do padrão que considero muito confusa:
Pode haver mais de uma definição de uma
[...]
(13.4) — entidade modelo (13.1),
[...]
(13.6) — argumento modelo padrão
em um programa, desde que cada definição apareça em uma unidade de tradução diferente e as definições satisfaçam os seguintes requisitos. Dada tal entidade D definida em mais de uma unidade de tradução, para todas as definições de D, [...] os seguintes requisitos devem ser satisfeitos.
[...]
(13.10) — Em cada uma dessas definições, exceto dentro dos argumentos padrão e argumentos modelo padrão de D, as expressões lambda correspondentes devem ter o mesmo tipo de fechamento (veja abaixo).
Agora, podemos aplicar este parágrafo ao meu trecho de código acima
a) tomando D como o modelo de classe (que é uma entidade modelo), em cujo caso (13.10) parece dizer que o argumento de modelo padrão está isento desta regra, ou
b) tomando D como o argumento de modelo padrão, ao qual esta regra deve ser aplicada. O "veja abaixo" no final da citação se refere, presumo, ao ponto 14:
Se D for um modelo e for definido em mais de uma unidade de tradução, os requisitos precedentes devem ser aplicados tanto aos nomes do escopo envolvente do modelo usados na definição do modelo (13.8.3), quanto aos nomes dependentes no ponto de instanciação (13.8.2). Esses requisitos também se aplicam às entidades correspondentes definidas dentro de cada definição de D (incluindo os tipos de fechamento de expressões lambda, mas excluindo entidades definidas dentro de argumentos padrão ou argumentos de modelo padrão de D ou uma entidade não definida dentro de D). Para cada uma dessas entidades e para o próprio D, o comportamento é como se houvesse uma única entidade com uma única definição, incluindo na aplicação desses requisitos a outras entidades. [Nota: A entidade ainda é declarada em várias unidades de tradução, e 6.6 ainda se aplica a essas declarações. Em particular, as expressões lambda (7.5.5) que aparecem no tipo de D podem resultar em diferentes declarações tendo tipos distintos, e as expressões lambda que aparecem em um argumento padrão de D ainda podem denotar tipos diferentes em diferentes unidades de tradução. — nota final]
do qual eu entendo: se D é minha classe de modelo, o argumento de modelo padrão está isento desta regra. Mas então a nota no final continua especificando que a expressão lambda no argumento de modelo padrão pode ter tipos diferentes em TUs diferentes, portanto, presumo, quebrando ODR.
Edição 2: muito relacionado, mas ainda não consigo chegar a uma conclusão final:
Significado da observação sobre itens definidos várias vezes
As expressões lambda que aparecem em diferentes definições de uma mesma entidade produzem o mesmo tipo de fechamento?