As you should know by now in C++11 we are able disable certain signatures in our classes. Most of the time this is used to disable copy constructor and assignment operators
this way is much better than the old way where the programmer had to declare private both member and then not implement them getting an error either at compile time or either at linking time.
The delete specifier can disable some automatic overloads consider indeed the following code
it works perfectly but if we do not want that automatic conversion (note that explicit can not be used here) then the delete specifier can come in handy
A typical mistake in C++ is to store a reference (or a pointer for the matter) to a temporary object leading to a disaster. This mistake is one of the argument java guys put on the table when they are arguing against C++.
The following class is a perfectly working class but used wrongly can store a reference to a temporary object
The delete specifier can help us again indeed we can disable the constructor with a rvalue reference and avoid such use:
now the code above will lead to a compilation error in case we are trying to build the class with a temporary string, you should note that a "const &&" is needed, indeed without the const specifier passing a "const std::string foo()" will not led to a compilation error
Time to add to my coding rules a new rule!
3 comments:
you should note that a "const &&" is needed, indeed without the const specifier passing a "const std::string foo()" will not led to a compilation error
Why is that?
Temporaries are not always r-value references.
Something like this will still expose the flaw of having a reference member:
CrashDestination test()
{
std::string s{"Hello"};
return CrashDestination(s);
}
For new programmers, its always difficult to use specifiers either they are delete or access specifiers.
Learn C++ in Urdu
Post a Comment