Associações estruturadas não permitem tipos decomponíveis vazios.
auto [] = std::make_tuple(); // error
Desde que P1061R10 foi aceito para C++26, isso permite que ligações estruturadas introduzam pacotes (desde que o pacote seja declarado dentro do contexto do modelo):
auto [...args] = return_empty_tuple();
auto [one, ...rest] = return_single_tuple();
Este último permite ...rest
ser um pacote vazio se return_single_tuple()
tiver um tamanho de ligação estruturado de 1.
Minha pergunta é: ...args
ainda é possível declarar um pacote vazio mesmo que return_empty_tuple()
tenha um tamanho de ligação estruturada zero (por exemplo, tamanho de tupla zero)?
P1061R10 menciona "vazio" duas vezes, mas não responde sua pergunta diretamente, e o último rascunho do C++26 ainda não inclui o texto para P1061, mas ouso dizer que sim .
Em P1061, os autores mostram muitos exemplos de como deixar ligações estruturadas introduzirem pacotes simplifica o código genérico onde
std::apply
deve ser usado hoje, às vezes em múltiplas camadas. Até mesmo a implementação destd::apply
si mesma poderia ser simplificada parade acordo com a proposta. Se pacotes vazios não forem permitidos, essa implementação de
std::apply
não funcionaria, e nem muitas outras situações em código genérico.Portanto, não há dúvidas de que os autores queriam que embalagens vazias fossem permitidas.
(Além disso, a implementação experimental do P1061 no Clang os aceita: Demo )
A redação do P1061R10 contém o seguinte:
Isso indica que é permitido que um pacote de vinculação estruturada introduza 0 vinculações estruturadas, o que já foi apontado pelo OP.
A questão do OP é se o tamanho da ligação estruturada também pode ser 0. Não parece haver nada no artigo que o proíba. Portanto, ele é coberto pela regra geral em [temp.variadic]/8 :
Por exemplo,
template <class... Bases> struct T : Bases... {};
é bem formado mesmo quandoBases
é um pacote vazio; não se torna equivalente astruct T : {};
que seria mal formado porque não há nada depois dos dois pontos. Similarmente,auto [...args] = return_empty_tuple();
deve ser bem formado e introduzir zero ligações estruturadas mesmo que seja mal formado escreverauto [] = return_empty_tuple();
.