Нет Компилятор предоставит средство для определения, является ли переменная ссылкой или нет. Создание ссылочных переменных - очень тривиальная операция, и в большинстве случаев намерение будет подлинным. Будет неприятно получать предупреждения компиляции для всех ссылок, присутствующих в коде.
Хороший способ выяснить, была ли переменная объявлена как ссылка, состоит в проведении экспертной оценки.
Однако, если вы хотите обнаружить это самостоятельно, есть один хак, который я могу вспомнить сейчас. мы можем использовать тот факт, что ссылка должна быть всегда инициализированной в конструкторе. Вы можете создать общий конструктор с намеренно странным синтаксисом для всех классов. Пример:
#define REFERENCE_CHECK(CLASS) CLASS(int***, char***)
class A { // case [1]
REFERENCE_CHECK(A) {}
};
class B { // case [2]
X &p; // genuine reference
REFERENCE_CHECK(B) : p(*new X) {} // register with the constructor
};
class C { // case [3]
shared_ptr<int> &p;
REFERENCE_CHECK(C) {} // compiler error, because 'p' is not registered
};
Это псевдокод; помните, что при необходимости вам, возможно, придется регистрировать базовые классы и виртуальные классы также отдельно.