Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Rule 6.2.1: non-inline constexpr variables in headers?
#1
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!
Reply
#2
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
Posted by and on behalf of
the MISRA C++ Working Group
Reply
#3
Thank you for the clarification!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)