Eu quero saber quais são as diferenças semânticas entre a proposta de conceitos completos de C ++ e as restrições de modelo (por exemplo, restrições como apareceu em Dlang ou a nova proposta concepts-lite para C ++ 1y ).
O que conceitos completos são capazes de fazer do que as restrições de modelo não podem?
c++
c++11
d
c++-concepts
Rayniery
fonte
fonte
Respostas:
A seção 3 da proposta de restrições cobre isso em uma profundidade razoável.
A proposta de conceitos foi colocada em banho-maria por um curto período na esperança de que as restrições (ou seja, concepts-lite) possam ser concretizadas e implementadas em uma escala de tempo mais curta, atualmente visando pelo menos algo em C ++ 14. A proposta de restrições é projetada para atuar como uma transição suave para uma definição posterior de conceitos. As restrições fazem parte da proposta de conceitos e são um bloco de construção necessário em sua definição.
Em Design of Concept Libraries for C ++ , Sutton e Stroustrup consideram o seguinte relacionamento:
Para resumir rapidamente seus significados:
Portanto, se você adicionar axiomas (propriedades semânticas) às restrições (propriedades sintáticas), obterá conceitos.
Concepts-Lite
A proposta de conceitos leves nos traz apenas a primeira parte, restrições, mas este é um passo importante e necessário em direção a conceitos plenamente desenvolvidos.
Restrições
As restrições são todas sobre sintaxe . Eles nos fornecem uma maneira de discernir estaticamente as propriedades de um tipo em tempo de compilação, para que possamos restringir os tipos usados como argumentos de modelo com base em suas propriedades sintáticas. Na proposta atual de restrições, elas são expressas com um subconjunto de cálculo proposicional usando conectivos lógicos como
&&
e||
.Vamos dar uma olhada em uma restrição em ação:
Aqui estamos definindo um template de função chamado
sort
. A nova adição é a cláusula requer . A cláusula require fornece algumas restrições sobre os argumentos do template para esta função. Em particular, essa restrição diz que o tipoCont
deve ser umSortable
tipo. O interessante é que pode ser escrito de uma forma mais concisa como:Agora, se você tentar passar qualquer coisa que não seja considerada
Sortable
para esta função, você obterá um belo erro que imediatamente informa que o tipo deduzido paraT
não é umSortable
tipo. Se você tivesse feito isso em C ++ 11, teria ocorrido um erro horrível lançado de dentro dasort
função que não faria sentido para ninguém.Os predicados de restrições são muito semelhantes aos traços de tipo. Eles pegam algum tipo de argumento de modelo e fornecem algumas informações sobre ele. As restrições tentam responder aos seguintes tipos de perguntas sobre o tipo:
No entanto, as restrições não têm como objetivo substituir as características de tipo. Em vez disso, eles trabalharão de mãos dadas. Alguns traços de tipo agora podem ser definidos em termos de conceitos e alguns conceitos em termos de traços de tipo.
Exemplos
Portanto, o importante sobre as restrições é que elas não se importam nem um pouco com a semântica. Alguns bons exemplos de restrições são:
Equality_comparable<T>
: Verifica se o tipo tem==
com os dois operandos do mesmo tipo.Equality_comparable<T,U>
: Verifica se há um==
com operandos esquerdo e direito dos tipos fornecidosArithmetic<T>
: Verifica se o tipo é aritmético.Floating_point<T>
: Verifica se o tipo é um tipo de ponto flutuante.Input_iterator<T>
: Verifica se o tipo suporta as operações sintáticas que um iterador de entrada deve suportar.Same<T,U>
: Verifica se os tipos fornecidos são iguais.Você pode experimentar tudo isso com uma compilação leve de conceitos especiais do GCC .
Beyond Concepts-Lite
Agora vamos entrar em tudo além da proposta de conceitos leves. Isso é ainda mais futurista do que o próprio futuro. De agora em diante, tudo provavelmente mudará um pouco.
Axiomas
Os axiomas têm tudo a ver com semântica . Eles especificam relacionamentos, invariantes, garantias de complexidade e outras coisas semelhantes. Vejamos um exemplo.
Embora a
Equality_comparable<T,U>
restrição diga que existe umoperator==
que aceita tiposT
eU
, ela não diz o que essa operação significa . Para isso, teremos o axiomaEquivalence_relation
. Este axioma diz que quando objetos desses dois tipos são comparados comoperator==
doaçãotrue
, esses objetos são equivalentes. Isso pode parecer redundante, mas certamente não é. Você poderia facilmente definir umoperator==
que se comportasse como umoperator<
. Você seria mau em fazer isso, mas você poderia.Outro exemplo é um
Greater
axioma. É muito bom dizer que dois objetos do tipoT
podem ser comparados com os operadores>
e<
, mas o que eles significam ? OGreater
axioma diz que se fx
é maior entãoy
, entãoy
é menor quex
. A especificação proposta, tal axioma, se parece com:Portanto, os axiomas respondem aos seguintes tipos de perguntas:
Ou seja, eles se preocupam inteiramente com a semântica de tipos e operações nesses tipos. Essas coisas não podem ser verificadas estaticamente. Se isso precisar ser verificado, um tipo deve de alguma forma proclamar que está de acordo com essa semântica.
Exemplos
Aqui estão alguns exemplos comuns de axiomas:
Equivalence_relation
: Se dois objetos se comparam==
, eles são equivalentes.Greater
: Semprex > y
, entãoy < x
.Less_equal
: Semprex <= y
, então!(y < x)
.Copy_equality
: Parax
ey
de tipoT
: sex == y
, um novo objeto do mesmo tipo criado por construção de cópiaT{x} == y
e aindax == y
(ou seja, não é destrutivo).Conceitos
Agora, os conceitos são muito fáceis de definir; eles são simplesmente a combinação de restrições e axiomas . Eles fornecem um requisito abstrato sobre a sintaxe e a semântica de um tipo.
Como exemplo, considere o seguinte
Ordered
conceito:Em primeiro lugar, observe que para que o tipo de modelo
T
sejaOrdered
, ele também deve atender aos requisitos doRegular
conceito. ORegular
conceito é um requisito muito básico de que o tipo seja bem comportado - pode ser construído, destruído, copiado e comparado.Além desses requisitos, o
Ordered
requer queT
cumpra uma restrição e quatro axiomas:Ordered
tipo deve ter umoperator<
. Isso é verificado estaticamente, portanto, deve existir.x
ey
do tipoT
:x < y
dá uma ordem total estrita.x
é maior quey
,y
é menor quex
e vice-versa.x
é menor ou igual ay
,y
não é menor quex
e vice-versa.x
é maior ou igual ay
,y
não é maior quex
e vice-versa.Combinar restrições e axiomas como esse fornece conceitos. Eles definem os requisitos sintáticos e semânticos para tipos abstratos para uso com algoritmos. Os algoritmos atualmente têm que assumir que os tipos usados suportarão certas operações e expressarão certas semânticas. Com conceitos, seremos capazes de garantir que os requisitos sejam atendidos.
No projeto de conceitos mais recentes , o compilador só verifica se os requisitos sintáticos de um conceito são atendidos pelo argumento do modelo. Os axiomas não são verificados. Como os axiomas denotam semânticas que não são estaticamente avaliáveis (ou muitas vezes impossíveis de verificar inteiramente), o autor de um tipo teria que declarar explicitamente que seu tipo atende a todos os requisitos de um conceito. Isso era conhecido como mapeamento de conceito em projetos anteriores, mas foi removido desde então.
Exemplos
Aqui estão alguns exemplos de conceitos:
Regular
os tipos são construtíveis, destrutíveis, copiáveis e podem ser comparados.Ordered
tipos suportamoperator<
e têm uma ordem total estrita e outras semânticas de ordem.Copyable
os tipos podem ser construídos por cópia, destrutíveis e, sex
for igual ay
ex
for copiado, a cópia também será comparada igual ay
.Iterator
tipos tipos devem ter associadasvalue_type
,reference
,difference_type
, eiterator_category
que se deve atender a certos conceitos. Eles também devem suportaroperator++
e ser desreferenciáveis.The Road to Concepts
As restrições são o primeiro passo em direção a um recurso de conceitos completos do C ++. Eles são uma etapa muito importante, porque fornecem os requisitos de tipos que podem ser executados estaticamente para que possamos escrever funções e classes de modelo muito mais limpas. Agora podemos evitar algumas das dificuldades e feiúras de
std::enable_if
e seus amigos de metaprogramação.No entanto, há uma série de coisas que a proposta de restrições não faz:
Não fornece uma linguagem de definição de conceito.
As restrições não são mapas conceituais. O usuário não precisa anotar especificamente seus tipos para atender a certas restrições. Eles são verificados estaticamente usando recursos de linguagem de tempo de compilação simples.
As implementações de modelos não são restringidas pelas restrições de seus argumentos de modelo. Ou seja, se o seu template de função faz algo com um objeto de tipo restrito que não deveria fazer, o compilador não tem como diagnosticar isso. Uma proposta de conceitos com todos os recursos seria capaz de fazer isso.
A proposta de restrições foi projetada especificamente para que uma proposta de conceitos completos possa ser introduzida em cima dela. Com alguma sorte, essa transição deve ser um passeio bastante suave. O grupo de conceitos está procurando introduzir restrições para C ++ 14 (ou em um relatório técnico logo depois), enquanto conceitos completos podem começar a surgir em algum momento em torno do C ++ 17.
fonte
Veja também "o que é 'lite' sobre os conceitos lite" na seção 2.3 das recentes (12 de março) atas de teleconferências de conceitos e registro da discussão, que foram postadas no mesmo dia aqui: http://isocpp.org/blog/2013/03 / new-paper-n3576-sg8-concepts-teleconference-minutes-2013-03-12-herb-sutter .
fonte
Meus 2 centavos:
A proposta concepts-lite não se destina a fazer "verificação de tipo" de implementação de modelo . Ou seja, o Concepts-lite garantirá (teoricamente) a compatibilidade da interface no site de instanciação do modelo. Citando o artigo: "concepts lite é uma extensão de C ++ que permite o uso de predicados para restringir argumentos de template". E é isso. Isso não diz que o corpo do modelo será verificado (isoladamente) em relação aos predicados. Isso provavelmente significa que não há noção de primeira classe de arquétipos quando você está falando sobre conceitos leves . arquétipos, se bem me lembro, em propostas de conceitos pesados são tipos que oferecem nada menos e nada mais para satisfazer a implementação do modelo.
concepts-lite usam funções constexpr glorificadas com um pouco de truque de sintaxe suportado pelo compilador. Nenhuma mudança nas regras de pesquisa.
Os programadores não são obrigados a escrever mapas de conceitos.
Finalmente, citando novamente "A proposta de restrições não aborda diretamente a especificação ou o uso da semântica; ela visa apenas a verificação da sintaxe." Isso significaria que os axiomas não estão dentro do escopo (até agora).
fonte