Constants - literals

Jun 12, 2019 at 1:50am
Hi, I am learning about constants and I am slightly confused about what I am reading. The sites and book I am using says that a literal, is a constant. So I assume something like int a = 1; is a literal. But I dont understand how that is a constant. I can change that later in code, a = 2; and now 'a' has a different value. But from my understanding, I should not be able to change the value of a constant.

I am obviously confused with something here, but not sure what part I am misunderstanding. If anyone could give me a better way of understanding this, or possibly see what I am not understanding, it would be greatly appreciated
Jun 12, 2019 at 2:03am
int a = 1; //1 is a literal. a is not const.
const int a = 1; //1 is a literal and a is const. the compiler can change all a's into 1's if it wants, it does not need to go fetch a to get its value like it would a variable. change a now and it is a compiler error.

and newer code uses constexpr instead of const, its a little more flexible.
older code may use #defines, which is C-ish; they don't have a strong type and can be troublesome.

you seem to have overlooked the keywords that make a constant a constant instead of a variable, is all?
Last edited on Jun 12, 2019 at 2:05am
Jun 12, 2019 at 2:09am
int a = 1; is the declaration of a variable.
The variable being declared is a, it is initialised with the integer literal 1
Jun 12, 2019 at 2:10am
The literal value is just representing the value you want stored in the variable. The variable itself is not constant just because the value you copied from was. Consider this:

1
2
const int a = 1;    // now a actually is constant
int b = a;          // but b isn't; it just copied a's value 

String literals are different since they are ultimately represented as a constant character pointer that points to the characters in the string literal (which are often stored in "read-only" memory so that writing to them would segfault).

1
2
const char * a = "hello";
char * b = a;             // this is not good; compiler should complain 


Jun 12, 2019 at 2:22am
Ok I think I might be understanding it now. The literal is just a value, ie - 7, and its a constant because 7 is just 7 i cant change 7 to mean something else.

And then if i use const int a = 1; then i can not change a to be anything else than 1.

Is that right?

I have read a small amount about constexpr, but wanted to understand literal etc before getting into that. Thats next in the book for me :)
Jun 12, 2019 at 2:37am
> if i use const int a = 1; then i can not change a to be anything else than 1.

Yes. The type of a would then be const int;
the variable identifies a const object; an object that cannot be modified.


The type of a string literal is an array (of const char type) with an additional null character as the last element.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <type_traits>

template < typename T >
void what_is_this( const T& x )
{
    if constexpr ( std::is_array<T>::value )
       std::cout << "array of size " << sizeof(x)/sizeof(x[0])<< '\n' ;

    else if constexpr ( std::is_pointer<T>::value ) std::cout << "pointer\n" ;

    else std::cout << "something else\n" ;
}

int main()
{
    what_is_this( "hello world!" ) ; // array of size 13
}

http://coliru.stacked-crooked.com/a/34579b52f2cad1ba
https://rextester.com/OJGKKV90613
Last edited on Jun 12, 2019 at 2:39am
Topic archived. No new replies allowed.