2012-03-20 3 views
0

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

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

EDIT: Я думаю о чем-то в строках проверок/предупреждений строки формата printf, где выполняются конкретные проверки. Например, что-то, что проверяет shared_ptr, а не общее предупреждение «ссылочный элемент».

+1

Конечно, ваш код не будет компилироваться, потому что он нарушает правильность 'const'. – Puppy

+1

Как это вообще связано с 'shared_ptr'? – Mankarse

+0

Вы можете просто использовать регулярное выражение (чтобы уловить большинство случаев), что-то вроде 'shared_ptr \ s * <\s*\w+\s*> \ s * &'. – Mankarse

ответ

1

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

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

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

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

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

Смежные вопросы