C++中能否强制类通过引用或指针传递并触发编译警告?
实现方案
可以通过编译器属性标注+静态检查两种方式实现你的需求,既保留合法拷贝能力,又能对非必要的隐式拷贝触发警告:
方案1:编译器属性标注(直接在类定义中实现)
GCC/Clang/MSVC都支持对函数标注自定义警告属性,你可以给拷贝构造函数添加警告标记,只要该函数被调用(包括传值时的隐式调用)就会触发编译器警告:
class doNotSilentCopy { public: doNotSilentCopy(size_t size) { mysize = size; dummy = (int*)malloc(mysize); }; doNotSilentCopy() : doNotSilentCopy(0) {}; // 适配不同编译器的警告属性 #ifdef __GNUC__ __attribute__((warning("该类内存开销较大,若非必要请优先使用引用传递,确需拷贝可忽略本警告"))) #elif _MSC_VER __declspec(deprecated("该类内存开销较大,若非必要请优先使用引用传递,确需拷贝可忽略本警告")) #endif doNotSilentCopy(const doNotSilentCopy& rhs) { this->mysize = rhs.mysize; this->dummy = (int*)malloc(this->mysize); // 内存拷贝逻辑按需补充 }; ~doNotSilentCopy(void) { if (dummy) { free(dummy); dummy = nullptr; mysize = 0; } }; int get(int index) { return *(dummy + index); }; private: size_t mysize; int* dummy; };
你示例中的getDataBad(mycls, 5)调用会触发上述警告,而引用传递的getDataGood不会触发。如果确实需要合法传值,直接忽略该警告即可,不会阻断编译。
方案2:静态检查工具规则配置(更灵活)
如果不想修改类代码,或者需要跨编译器统一规则,可以通过Clang-Tidy等静态检查工具配置:
开启performance-unnecessary-value-param检查,并在配置中指定doNotSilentCopy为不允许值传递的类型,只要函数参数出现该类的值传递就会触发检查警告。该方案还可以自动识别确实需要值传递的合法场景(比如函数内部需要修改传入的副本),不会误报。
补充说明
如果希望完全阻断隐式拷贝、只允许显式拷贝,可以给拷贝构造函数添加explicit修饰,此时隐式传值会直接编译报错,只有显式调用拷贝构造(比如getDataBad(doNotSilentCopy(mycls),5))才能正常编译,适合对拷贝管控更严格的场景。
内容的提问来源于stack exchange,提问作者LVB
相关产品推荐
相关产品推荐

