为什么jthread::get_stop_source成员函数未被声明为const?
为什么
std::jthread::get_stop_source没有被设计为纯观察者接口? C++标准[thread.jthread.stop]/1中对该接口的规定如下:
[[nodiscard]] stop_source get_stop_source() noexcept;效果: 等价于执行
return ssource;
既然该接口的实现逻辑仅为返回内部成员变量,为什么它没有被设计为纯观察者(即const成员函数)?
核心原因和stop_source的语义、C++的const约定直接相关:
- 拿到
get_stop_source返回的stop_source实例后,使用者可以直接调用其request_stop()方法发起停止请求,这个操作会修改jthread内部关联的停止状态,本质上属于修改jthread逻辑状态的行为。如果把get_stop_source设计为const成员,就会出现「通过const修饰的jthread对象就能修改其核心运行状态」的结果,完全违反了const成员函数「不修改对象逻辑状态」的语义约定。 - 这一设计也和
jthread的其他停止相关接口保持了一致性:jthread的request_stop()本身就是非const成员,作为可以获取到停止请求发起能力的接口,get_stop_source被设计为非const,也更符合开发者的常规认知,避免出现语义混淆。
内容的提问来源于stack exchange,提问作者Alex Guteniev
相关产品推荐
相关产品推荐

