I know the answer is 99.99% no, but I figured it was worth a try, you never know.
void SomeFunction(int a) { // Here some processing happens on a, for example: a *= 50; a %= 10; if(example()) a = 0; // From this point on I want to make "a" const; I don't want to allow // any code past this comment to modify it in any way. }
I can do something somewhat similar with const int b = a;
, but it's not really the same and it creates a lot of confusion. A C++0x-only solution is acceptable.
EDIT: another less abstracted example, the one that made me ask this question:
void OpenFile(string path) { boost::to_lower(path); // I want path to be constant now ifstream ... }
EDIT: another concrete example: Recapture const-ness on variables in a parallel section.
Variables can be declared as constants by using the “const” keyword before the datatype of the variable. The constant variables can be initialized once only. The default value of constant variables are zero.
To declare a constant variable in C++, the keyword const is written before the variable's data type. Constant variables can be declared for any data types, such as int , double , char , or string .
The constant variable values cannot be changed after its initialization. In this section we will see how to change the value of some constant variables. If we want to change the value of constant variable, it will generate compile time error.
Constants are basically variables whose value can't change. In C/C++, the keyword const is used to declare these constant variables. In Java, you use the keyword final .
You could move the code to generate a
into another function:
int ComputeA(int a) { a *= 50; a %= 10; if (example()) a = 0; return a; } void SomeFunction(const int a_in) { const int a = ComputeA(a_in); // .... }
Otherwise, there's no nice way to do this at compile time.
One solution would be to factor all of the mutation code into a lambda expression. Do all of the mutation in the lambda expression and assign the result out to a const int
in the method scope. For example
void SomeFunction(const int p1) { auto calcA = [&]() { int a = p1; a *= 50; a %= 10; if(example()) a = 0; .. return a; }; const int a = calcA(); ... }
or even
void SomeFunction(const int p1) { const int a = [&]() { int a = p1; a *= 50; a %= 10; if(example()) a = 0; .. return a; }(); ... }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With