当你将类成员声明为对shared_ptr
的(const)引用时,有没有办法用g ++来检测?我看不出这个有用的时间,但如果你不小心宣布该成员作为参考,你可以结束一些难以发现的错误,如果你的引用数量过早地达到零(因为该成员不是按价值持有)。
或者,您是否只是仔细编写代码并依赖同行评审?
编辑:我正在考虑printf
格式字符串检查/警告的内容,其中进行了特定检查。例如,检查shared_ptr
的内容,而不是一般的“引用成员”警告。
答案 0 :(得分: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
};
这是伪代码;请记住,如果需要,您可能还必须单独注册基类和虚拟类。