Hi,
while programming device servers in C++ I found an issue using DeviceData with std::string.
The operator to store an std::string into the DeviceData object takes an argument passed by reference that is not const.
DeviceData.h:383
void operator << (string &datum) {any <<= datum.c_str();}
But the ‘any’ object will make a copy of the string. So why is it not passed by const reference?
This will prevent for example to write code like this:
DeviceData d;
stringstream message;
message << "some text";
d << message.str();
By studying the library code, I found other occurrences where a const specifier for string arguments may be included.
For example, when storing a string value inside a DbDatum a copy is made, so it is not needed for the argument of the operator to be modifiable. The reference can then be to a const string.
dbapi_datum.cpp:783
void DbDatum::operator << (string& datum)
In DeviceImpl definition the member function get_name() return a writable reference to the device name. Is this by design? If the name is modifiable, shouldn’t be with a set_name method? Also you will not be able to read the name from a pointer to a const device, since the method is not const.
device.h:240
string &get_name() {return device_name;}
Are all these const omitted by design?
In principle adding them will not break backward compatibility.
If fixing this is of any interest, I can help by opening a pull request on github.
Best regards
Michele