int main()
{
/* Values */
int i = 4; // not constant, can be modified:
i = 5;
const int ci = 6; // constant, must be initialized
ci = 7; // syntax error, cannot be modified
/* References */
int &ir1 = i; // reference, must be initialized
ir1 = 6;
int &ir2 = ci; // syntax error, const correctness would be flawed
const int &cir1 = ci; // constant reference to a constant value
cir1 = 7; // syntax error
const int &cir2 = i; // const reference to a non-const value, still ok
cir2 = 7; // syntax error, cir2 is const reference
/* Pointers */
int *ip;
ip = &i;
*ip = 5; // ok
ip = &ci; // syntax error, const correctness would be flawed
const int *cip = &ci; // ok
*cip = 7; // syntax error
ip = cip; // syntax error, C++ keeps constness
cip = ip; // ok, but now:
*cip = 5; // syntax error, wherever cip points is const
int const *icp; // same as const int *
icp = &i; // ok, can assign to, icp is NOT const, *icp IS
*icp = 5; // syntax error, wherever icp points is const
/* Can a pointer be constant? */
int * const ipc = &i; // ipc IS const, must be initialized
*ipc = 5; // OK, where ipc points to is NOT a const
int * const ipc2 = &ci; // syntax error, ipc2 is NOT pointer to const
const int * const cipc = &ci; // const pointer to a const
return 0;
}
aW50IG1haW4oKQp7CiAgLyogVmFsdWVzICovCiAgICAgICAgICAgIGludCBpID0gNDsgIC8vIG5vdCBjb25zdGFudCwgY2FuIGJlIG1vZGlmaWVkOiAKICAgICAgICAgICAgICAgIGkgPSA1OwoKICAgICBjb25zdCBpbnQgY2kgPSA2OyAgLy8gY29uc3RhbnQsIG11c3QgYmUgaW5pdGlhbGl6ZWQKICAgICAgICAgICAgICAgY2kgPSA3OyAgLy8gc3ludGF4IGVycm9yLCBjYW5ub3QgYmUgbW9kaWZpZWQKCiAgLyogUmVmZXJlbmNlcyAqLwogICAgICAgICBpbnQgJmlyMSA9IGk7ICAvLyByZWZlcmVuY2UsIG11c3QgYmUgaW5pdGlhbGl6ZWQKICAgICAgICAgICAgICBpcjEgPSA2OwoKICAgICAgICAgaW50ICZpcjIgPSBjaTsgLy8gc3ludGF4IGVycm9yLCBjb25zdCBjb3JyZWN0bmVzcyB3b3VsZCBiZSBmbGF3ZWQKCiAgY29uc3QgaW50ICZjaXIxID0gY2k7IC8vIGNvbnN0YW50IHJlZmVyZW5jZSB0byBhIGNvbnN0YW50IHZhbHVlCiAgICAgICAgICAgICBjaXIxID0gNzsgIC8vIHN5bnRheCBlcnJvcgoKICBjb25zdCBpbnQgJmNpcjIgPSBpOyAgLy8gY29uc3QgcmVmZXJlbmNlIHRvIGEgbm9uLWNvbnN0IHZhbHVlLCBzdGlsbCBvawogICAgICAgICAgICAgY2lyMiA9IDc7ICAvLyBzeW50YXggZXJyb3IsIGNpcjIgaXMgY29uc3QgcmVmZXJlbmNlCgogIC8qIFBvaW50ZXJzICovCiAgICAgICAgIGludCAqaXA7CiAgICAgICAgICAgICAgaXAgPSAmaTsKICAgICAgICAgICAgICppcCA9IDU7ICAgLy8gb2sKCiAgICAgICAgICAgICAgaXAgPSAmY2k7IC8vIHN5bnRheCBlcnJvciwgY29uc3QgY29ycmVjdG5lc3Mgd291bGQgYmUgZmxhd2VkCgogIGNvbnN0IGludCAqY2lwID0gJmNpOyAvLyBvayAKICAgICAgICAgICAgKmNpcCA9IDc7ICAgLy8gc3ludGF4IGVycm9yCgoKICAgICAgICAgICAgICBpcCA9IGNpcDsgLy8gc3ludGF4IGVycm9yLCBDKysga2VlcHMgY29uc3RuZXNzCiAgICAgICAgICAgICBjaXAgPSBpcDsgIC8vIG9rLCBidXQgbm93OgogICAgICAgICAgICAqY2lwID0gNTsgICAvLyBzeW50YXggZXJyb3IsIHdoZXJldmVyIGNpcCBwb2ludHMgaXMgY29uc3QgCgogIGludCBjb25zdCAqaWNwOyAgICAgICAvLyBzYW1lIGFzIGNvbnN0IGludCAqCiAgICAgICAgICAgICBpY3AgPSAmaTsgIC8vIG9rLCBjYW4gYXNzaWduIHRvLCBpY3AgaXMgTk9UIGNvbnN0LCAqaWNwIElTCiAgICAgICAgICAgICppY3AgPSA1OyAgIC8vIHN5bnRheCBlcnJvciwgd2hlcmV2ZXIgaWNwIHBvaW50cyBpcyBjb25zdAoKICAvKiBDYW4gYSBwb2ludGVyIGJlIGNvbnN0YW50PyAqLwogICAgICAgICBpbnQgKiBjb25zdCBpcGMgPSAmaTsgIC8vIGlwYyBJUyBjb25zdCwgbXVzdCBiZSBpbml0aWFsaXplZCAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICppcGMgPSA1OyAgIC8vIE9LLCB3aGVyZSBpcGMgcG9pbnRzIHRvIGlzIE5PVCBhIGNvbnN0CgogICAgICAgIGludCAqIGNvbnN0IGlwYzIgPSAmY2k7IC8vIHN5bnRheCBlcnJvciwgaXBjMiBpcyBOT1QgcG9pbnRlciB0byBjb25zdAogIGNvbnN0IGludCAqIGNvbnN0IGNpcGMgPSAmY2k7IC8vIGNvbnN0IHBvaW50ZXIgdG8gYSBjb25zdAoKICByZXR1cm4gMDsKfQ==
prog.cpp: In function 'int main()':
prog.cpp:8:19: error: assignment of read-only variable 'ci'
ci = 7; // syntax error, cannot be modified
^
prog.cpp:14:21: error: invalid initialization of reference of type 'int&' from expression of type 'const int'
int &ir2 = ci; // syntax error, const correctness would be flawed
^
prog.cpp:17:19: error: assignment of read-only reference 'cir1'
cir1 = 7; // syntax error
^
prog.cpp:20:19: error: assignment of read-only reference 'cir2'
cir2 = 7; // syntax error, cir2 is const reference
^
prog.cpp:27:18: error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
ip = &ci; // syntax error, const correctness would be flawed
^
prog.cpp:30:18: error: assignment of read-only location '* cip'
*cip = 7; // syntax error
^
prog.cpp:33:18: error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
ip = cip; // syntax error, C++ keeps constness
^
prog.cpp:35:18: error: assignment of read-only location '* cip'
*cip = 5; // syntax error, wherever cip points is const
^
prog.cpp:39:18: error: assignment of read-only location '* icp'
*icp = 5; // syntax error, wherever icp points is const
^
prog.cpp:45:29: error: invalid conversion from 'const int*' to 'int*' [-fpermissive]
int * const ipc2 = &ci; // syntax error, ipc2 is NOT pointer to const
^