Est-ce que const et constexpr seront finalement la même chose?

Je viens de lire la réponse à

const vs constexpr sur les variables

et je regarde ce Google Tech Talk sur les fonctionnalités C ++ 11/14, dans lesquelles il est dit que, bien, constexpr pourrait ne plus être nécessaire dans le futur en ce qui concerne les fonctions, car les compilateurs évolueront pour le comprendre par eux-mêmes. . Enfin, les compilateurs Java et les machines virtuelles Java travaillent dur pour comprendre que les classes (ou toute variable peut-être) sont immuables après la construction – sans que vous le disiez explicitement – et font toutes sortes d’optimisations optimistes basées sur ce fait.

Alors, voici la question: le destin de const et constexpr sera-t-il finalement la même chose? En d’autres termes, même s’il n’est pas garanti qu’un compilateur effectue l’initialisation d’exécution, etc., ne le fera-t-il pas éventuellement chaque fois que cela est possible (fondamentalement)? Et lorsque cela se produit, l’un des mots clés ne sera-t-il pas redondant? (Tout comme Inline devient peut-être)?

Non, aucun ne remplacera l’autre, ils ont des rôles différents. Bjarne Stroustrup nous dit dans sa FAQ C ++ que constexpr ne remplace pas const et décrit les différents rôles de chaque fonctionnalité:

Veuillez noter que constexpr n’est pas un substitut d’usage général pour const (ou vice versa):

  • La fonction principale de const est d’exprimer l’idée qu’un object n’est pas modifié via une interface (même si l’object peut très bien être modifié via d’autres interfaces). Il se trouve que la déclaration d’un object const fournit d’excellentes opportunités d’optimisation pour le compilateur. En particulier, si un object est déclaré const et que son adresse n’est pas utilisée, un compilateur est souvent capable d’évaluer son initialiseur au moment de la compilation (bien que cela ne soit pas garanti) et de conserver cet object dans ses tables plutôt que de l’émettre dans le code généré .
  • La fonction principale de constexpr est d’étendre la plage de ce qui peut être calculé au moment de la compilation, en sécurisant ce type de calcul. Les objects déclarés constexpr ont leur initialiseur évalué lors de la compilation; ce sont essentiellement des valeurs conservées dans les tables du compilateur et uniquement émises dans le code généré si nécessaire.