Me deparei com o seguinte código:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Há uma coisa que não consigo entender:
Onde eu poderia descobrir o que o operador de seta ( ->
) significa no cabeçalho da função? Eu acho que, logicamente, o ->
operador determina um tipo que auto
será deduzido, mas eu quero esclarecer isso. Não consigo encontrar nenhuma informação.
Respostas:
No C ++ 11, existem duas sintaxes para declaração de função:
identificador de tipo retorno
(
declarações-argumento ...)
e
auto
identificador(
argumento-declarações ...)
->
return_typeEles são equivalentes. Agora, quando são equivalentes, por que você deseja usar o último? Bem, o C ++ 11 introduziu essa
decltype
coisa interessante que permite descrever o tipo de uma expressão. Portanto, você pode derivar o tipo de retorno dos tipos de argumento. Então você tenta:e o compilador lhe dirá que ele não sabe o que
a
eb
está nodecltype
argumento. Isso ocorre porque eles são declarados apenas pela lista de argumentos.Você poderia solucionar o problema facilmente usando
declval
os parâmetros de modelo que já foram declarados. Gostar:exceto que está ficando muito detalhado agora. Portanto, a sintaxe da declaração alternativa foi proposta e implementada e agora você pode escrever
e é menos detalhado e as regras de escopo não precisam ser alteradas.
Atualização do C ++ 14: o C ++ 14 também permite apenas
auto
identificador(
argumento-declarações ...)
desde que a função esteja totalmente definida antes do uso e todas as
return
instruções sejam deduzidas para o mesmo tipo. A->
sintaxe permanece útil para funções públicas (declaradas no cabeçalho) se você deseja ocultar o corpo no arquivo de origem. Obviamente, isso não pode ser feito com modelos, mas existem alguns tipos concretos (geralmente derivados da metaprogramação de modelos) que são difíceis de escrever de outra forma.fonte
C++14
conforme eu usoauto
parareturn
digitar essa função sem a necessidade da-> decltype(a + b)
peça. É redundante agora ou tem outros casos em que ainda deve ser usado? ou é uma extensão específica do compilador?auto
, sem a->
notação, desde que a função esteja totalmente definida antes do uso e todas asreturn
instruções sejam deduzidas para o mesmo tipo. A->
notação ainda será útil se você desejar usar a dedução para função pública enquanto oculta o corpo no arquivo de origem.Em inglês simples, ele diz que o tipo de retorno é o tipo inferido da soma de
a
eb
.fonte