Глобализация объектов констант

Есть у меня два глобальных объекта. Сейчас они определяются и инициализируются так

A a(5);
B b;

int main() {
  ......

Теперь я хочу их вынести в отдельный h файл и запретить модификацию этих переменных.

Пишу так

// globals.h
extern const A a;
extern const B b;
// globals.cpp
const A a(5);
const B b;

Сразу в h файле получаю подсказки

Clang-Tidy: Static variable 'a' may be dynamically initialized in this header file
Clang-Tidy: Static variable 'b' may be dynamically initialized in this header file

А при попытке использования этих переменных

#include "globals.h"

int main () {
  a.setValue(5);
}

получаю ошибку

'this' argument to member function 'print' has type 'const A', but function is not marked const

Т.е. получается, что я объявил не константную переменную, а переменную, содержащую константный объект

Если const убрать, то программа компилируется, но становится возможным переприсвоить этим переменным значение. И Clang-Tidy подсказки никуда не деваются

Update

Тут я вижу, что возникло недопонимание. Мне нужно вызывать неконстантные методы и менять состояние объекта. Я хочу запретить модификацию этих переменных.

Т.е.

b.setValue(10);  // OK
B b1;
b = b1;  // Error

фактически мою проблему решают функции

// globals.h
A getA();
B getB();
// globals.cpp

A a(5);
B b;

A getA() {
  return a;
}

B getB() {
  return b;
}

но хотелось бы без них

Update2

Нужен аналог константных указателей

A * const a = new A(5);

a->setValue(10);  // OK
a = nullptr;  // Error

Ответы (2 шт):

Автор решения: Lofectr
class A
{
public:
void print() const;
};

const говорит о том, что метод может использовать константный объект. И при этом поля нельзя изменять.

→ Ссылка
Автор решения: KoVadim

Если Вы хотите запретить конструкции вида

b = b1;  // Error

то Вам нужно просто напросто удалить конструктор копирования и оператор присваивания.

class A {
public:
  A(const A&) = delete;
  A& operator=(const A&) = delete;

если Вам не повезло и у Вас старый старый компилятор без поддержки с++11 - тогда перемещайте в приватную часть.

Также, возможно, нужно такое же сделать и для конструктора перемещения и оператора. Но тут по надобностям.

→ Ссылка