I have a function
const std::string& getRecordingJobToken() { return getToken(); }
const std::string& getToken() const { return m_Token; }
std::string m_Token;
I am able to call it as below
const std::string jobToken = getRecordingJobToken();
However when I do this,
const std::string jobToken;
jobToken = getRecordingJobToken();
It throws me this error -
error: passing ‘const string’ {aka ‘const std::__cxx11::basic_string’} as ‘this’ argument discards qualifiers [-fpermissive]
What is the difference ? I know that a reference variable has to be initialized immediately.
std::string &ref = a;
Is it some similiar logic ? The reason i am confused is that though getRecordingJobToken() returns a const reference, the variable jobToken that I have is not a reference variable. It is a variable that is used to take a string reference being returned from the getRecordingJobToken() function.
CodePudding user response:
Initialization and assignment are different things. jobToken is const, it could be initialized, e.g.
const std::string jobToken = getRecordingJobToken(); // copy-initialization
but can't be assigned (modified) later, e.g.
const std::string jobToken; // default-initialization
jobToken = getRecordingJobToken(); // fails; assignment
CodePudding user response:
I am able to call it as below
const std::string jobToken = getRecordingJobToken();However when I do this,
const std::string jobToken; jobToken = getRecordingJobToken();error ...
Yes, you can initialize a const object (which is what you do in the first example), but you can't assign to it/change it afterwards (which is what you try doing in the second example).
Note that you don't have to though. The function getRecordingJobToken() returns a const std::string& which is "cheap" with regards to resources. It's just a refrence to an internal std::string that the class or function keeps - but doesn't let anyone modify from the outside. If you only need to read the value, take it by const reference instead:
const std::string& jobToken = getRecordingJobToken();
If you on the other hand would like to modify the returned value, take it by value (and get a copy of whatever is returned). Your jobToken does not need to be const in this situation:
std::string jobToken = getRecordingJobToken();
jobToken = "foo"; // ok now since it's not `const`
