Определить ссылку на член класса shared_ptr с помощью g ++ - PullRequest
0 голосов
/ 20 марта 2012

Есть ли способ с g ++ обнаружить, когда вы объявляете член класса как (const) ссылку на shared_ptr? Я не вижу времени, когда это когда-нибудь будет полезно, но если вы случайно объявите участника как ссылку, вы можете столкнуться с некоторыми трудно обнаруживаемыми ошибками, если ваш счетчик ссылок преждевременно достигнет нуля (потому что участник не удержание по значению).

Или это тот случай, когда вы просто пишете код внимательно и полагаетесь на рецензирование?

РЕДАКТИРОВАТЬ: Я думаю о чем-то вроде проверки / предупреждений строки формата printf, где выполняются определенные проверки. Например, что-то, что проверяет shared_ptr, а не общее предупреждение "ссылочный элемент".

1 Ответ

1 голос
/ 20 марта 2012

Нет Компилятор предоставит средство для определения, является ли переменная ссылкой или нет. Создание ссылочных переменных - очень тривиальная операция, и в большинстве случаев намерение будет подлинным. Будет неприятно получать предупреждения компиляции для всех ссылок, присутствующих в коде.

Хороший способ выяснить, была ли переменная объявлена ​​как ссылка, состоит в проведении экспертной оценки.

Однако, если вы хотите обнаружить это самостоятельно, есть один хак, который я могу вспомнить сейчас. мы можем использовать тот факт, что ссылка должна быть всегда инициализированной в конструкторе. Вы можете создать общий конструктор с намеренно странным синтаксисом для всех классов. Пример:

#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
};

Это псевдокод; помните, что при необходимости вам, возможно, придется регистрировать базовые классы и виртуальные классы также отдельно.

...