MISRA Discussion Forums

Full Version: Rule 6.2.1: non-inline constexpr variables in headers?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hi, 

Consider the following example:

Code:
// foo.h
constexpr int kFoo = 123;

inline int foo(int x)
{
  return x * kFoo;
}

// tu1.cpp
#include "foo.h"
int tu1() { return foo(1); }

// tu2.cpp
#include "foo.h"
int tu2() { return foo(2); }

Does the function "foo" violate Rule 6.2.1 in this context, given that kFoo is not a C++17 inline variable? 
Or would it violate 6.2.1 only if kFoo were ODR-used (for example, passed by reference)?

Thanks!
The rule requires that ODR isn't violated, as defined by the standard. In general, its impractical for us explicitly enumerate all the way ODR can be violated.

In general, you need to consult [basic.def.odr]. However, our reading of the standard is that the answer to your first question is No (your example does not violate ODR)

Other refs:
https://en.cppreference.com/w/cpp/language/definition
https://eel.is/c++draft/basic.link#:linkage,inline_and

We also agree that the answer to your second question is Yes
Thank you for the clarification!
This thread now closed