You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

值传递且实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 14:40:01