Ok, so I bothered to read your code.

First, you declare your own copy-assignment operator without any good reason, instead of using the default one. Obviously you implemented it wrong:

Code:
S_html_attr_value& operator= (const S_html_attr_value& otherAttrValue) // Return by reference, not by value.
{
    ...
    return *this; // And return *this, not otherAttrValue.
}
However, this isn't the problem, since it is theoretically allowed and valid.
The problem is your operator< which does not do a proper total ordering of S_browser:

Code:
struct S_browser {

std::string name;
double version;

bool operator< (const S_browser& browser) const {

    if ((name == browser.name) && (version < browser.version)) {
        return true;
     }

     return false;
}

};
The total ordering should take into account any visible state.
Later in your code there is a map:

Code:
map<S_browser, TYPE_attr_values> a_map;

a_map.insert(make_pair(dummy_browser, supported_attr_values_for_Dummy_Browser));
a_map.insert(make_pair(ie_browser, supported_attr_values_for_IE));

supported_attr_values_for_Dummy_Browser_P = &a_map[dummy_browser];
supported_attr_values_for_IE_P = &a_map[ie_browser];
And because of the incorrectly implemented total ordering, your map has exactly one key-value pair. As a result, these two pointers point to the same instance giving you INPUT == OUTPUT. As grumpy has said:

you are retrieving an iterator from the map, doing something which changes the map (and therefore invalidates iterators), and then using the iterator.
Assuming that an untested code is valid is a bad practice.