...
If circumstances allow modification of the signature of g()
to accept parameters by value instead of by reference, then n
will not be odr-used within f()
because n
would then qualify as a constant expression. This solution is compliant, but it is not ideal. It may not be possible (or desirable) to modify the signature of g(),
such as if g()
represented std::max()
from <algorithm>
. Also, because of the differing linkage used by n
and f()
, accidental violations of the ODR are still likely if the definition of f()
is modified to odr-use n
.
Code Block | ||||
---|---|---|---|---|
| ||||
const int n = 42; int g(int lhs, int rhs); inline int f(int k) { return g(k, n); } |
Compliant Solution
In this compliant solution, the constant object n
is replaced with an enumerator of the same name. Named enumerations defined at namespace scope have the same linkage as the namespace they are contained in. The global namespace has external linkage, and so the definition of the named enumeration, and its contained enumerators, also have external linkage. Although less aesthetically pleasing, this compliant solution does not suffer from the same maintenance burdens of the previous code because n
and f()
have the same linkage:
...