Por que a constância correta é específica do C ++?

Disclaimer: Estou ciente de que existem duas questões sobre a utilidade da const-correctness, no entanto, nenhuma discutiu como a const-correctness é necessária em C ++ao contrário de outras linguagens de programação. Além disso, não estou satisfeito com as respostas fornecidas a essas perguntas.

Eu usei algumas linguagens de programação agora, e uma coisa que me incomoda em C ++ é a noção de correção de const. Não existe essa noção em Java, C #, Python, Ruby, Visual Basic, etc., isso parece ser muito específico para C ++.

Antes de você me indicar o C ++ FAQ Lite, eu o li e isso não me convence. Perfeitamente válido, programas confiáveis ​​são escritos em Python o tempo todo, e não há nenhuma palavra-chave const ou equivalente. Em Java e C #, os objetos podem ser declarados final (ou const), mas não há funções de membro const ou parâmetros de função const. Se uma função não precisar modificar um objeto, ela poderá receber uma interface que fornece apenas acesso de leitura ao objeto. Essa técnica pode ser usada igualmente em C ++. Nos dois sistemas C ++ do mundo real em que trabalhei, havia muito pouco uso de const em qualquer lugar, e tudo funcionava bem. Então, estou longe de ser vendido sobre a utilidade de deixar const contaminar uma base de código.

Eu estou querendo saber o que é em C ++ que faz const necessário,ao contrário de outras linguagens de programação.

Até agora, eu vi apenas um caso em que constdevo ser usado:

#include <iostream>

struct Vector2 {
    int X;
    int Y;
};

void display(/* const */ Vector2& vect) {
    std::cout << vect.X << " " << vect.Y << std::endl;
}

int main() {
    display(Vector2());
}

Compilar isso com const comentados é aceito pelo Visual Studio, mas com avisoC4239, extensão não padrão usada. Então, se você quer a brevidade sintática de passar em temporários, evitando cópias, e permanecendo compatível com o padrão, você tem que passar por referência const, sem nenhuma maneira de contornar isso. Ainda assim, isso é mais uma peculiaridade do que uma razão fundamental.

Caso contrário, não há realmente nenhuma situação em que const tenha que ser usado, exceto quando estiver fazendo interface com outro código que use const. Const me parece pouco mais do que uma praga hipócrita que se espalha por tudo que toca:

A razão que const trabalha em C ++ é porque você pode jogá-lo fora. Se você não pudesse jogá-lo fora, então seu mundo seria péssimo. Se você declarar um método que leva um const Bla, você poderia passar um Bla não const. Mas se for o contrário, você não pode. Se você declarar um método que leva um Bla não const, você não pode passar um Bla const. Então agora você está preso. Então você gradualmente precisa de uma versão const de tudo que não é const, e você acaba com um mundo sombrio. Em C ++ você se safa, porque, como em qualquer coisa em C ++, é puramente opcional, quer você queira essa verificação ou não. Você pode apenas bater a constelação de distância, se você não gosta.

Anders Hejlsberg (arquiteto C #),Opções de Design do CLR

questionAnswers(14)

yourAnswerToTheQuestion