10
votes

The title says all. I'm going to add an argument to a member function of a class with a default value. The argument is of a non-trivial type. Does this break ABI? Let's say my new library version is going to be M.m.0 and it should be available as a drop-in replacement for all linked applications that use M.m-1.x.

Sample code:

// These are some classes: base and child : public base

/* Version 1.2.3 */
class foo() {
public:
   void do_that_stuff(const std::string a);
}

/* Version 1.3.0 */
class foo() {
public:
   void do_that_stuff(const std::string a, const base& b = base());
}

PS: I did my own test, and it's working. Just can't be sure

1
The name says it all. Default arguments are arguments and have nothing to do with the function type (in particular, with function parameters).Kerrek SB
"Does this break ABI in backwards?" I'm sorry?Lightness Races in Orbit
do_that_stuff will get a different mangled name in old and new compilations - I think that breaks my definition of ABI compatibility.Richard Critten

1 Answers

13
votes

Most C++ ABIs encode the argument types of [member] functions in the symbol name. Default arguments are typically implemented as temporary objects conjured up at the point of call. If these are the choices done for the ABI used, adding a default argument will change the ABI. Whether that is the case you'll need to determine with the specific ABI used.