值传递且实现explicit operator bool的类参数能否使用_In_opt_?
关于值传递对象的MS SAL In_opt 标记使用疑问
如果一个按值传递的对象可通过explicit operator bool()返回false表示“空”状态,调用方可以传递空对象或有效对象,那这个参数能不能被视为可选参数?能不能给它标记_In_opt_?
我知道MS SAL文档里规定_In_opt_仅针对指针,但从逻辑上来说,传递有效对象是可选的,想确认这种用法是否可行。
示例代码:
class Id { public: Id(_In_ uint32_t id = 0) : m_id(id) {} explicit operator bool() const { return m_id != 0; } private: uint32_t m_id = 0; }; bool Test(_In_opt_ Id id) { if (!id) { return false; } // Do something with id return true; } int main() { Id emptyId; Id someId(3); if (Test(emptyId)) { } }
回答
- 从MS SAL的官方定义来看,
_In_opt_确实是专门为指针类型设计的,用来标记指针可以为NULL(空指针)。值传递的对象本身不存在“空”的概念——哪怕是你定义的“空状态”,它依然是一个合法构造的对象,不是空引用或空指针,所以严格来说不符合_In_opt_的设计初衷。 - 从逻辑层面讲,虽然你的代码能正常运行,也符合“可选传递有效对象”的语义,但这种用法会让依赖SAL分析的工具(比如Visual Studio的代码分析)产生误解,甚至可能误报或漏报问题。
- 更合适的做法是:要么不用SAL标记,要么自定义符合你这个类型语义的SAL注解,或者直接把参数改成指针/智能指针类型,这样就能合法使用
_In_opt_了。
内容的提问来源于stack exchange,提问作者user31161286
相关产品推荐
相关产品推荐

