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

给已标记[[nodiscard]]的类的构造器添加该标记是否有用?

关于[[nodiscard]]在类与构造函数上的重复标记问题

首先看你给出的类定义:

class [[nodiscard]] MyClass
{
public:
   MyClass() : _x(x) {} // 注:此处存在语法问题,默认构造函数引用了未定义的变量x,建议修正为比如_x(0)
   MyClass(int x) : _x(x) {}

private:
   int _x;
};

直接给结论:单独为构造函数添加[[nodiscard]]标记完全是冗余操作,和类声明上的标记效果完全一致,不会产生任何额外变化,只会徒增头文件冗余。

具体原因如下:

  • 当类被标记为[[nodiscard]]时,所有返回该类对象的函数(包括构造函数)都会自动继承这个属性。编译器会对任何丢弃该类对象的行为发出警告——不管这个对象是通过构造函数直接创建,还是通过其他成员函数、普通函数返回的。
  • 单独给构造函数加[[nodiscard]],不会扩展警告的触发范围,因为类级别的标记已经完全覆盖了构造函数的场景。

补充一点细节:
如果类没有标记[[nodiscard]],但单独给构造函数加这个属性,那只有直接丢弃构造函数返回的对象时才会触发警告;但在你的代码里,类已经加了标记,所以构造函数加不加都没有区别。

内容的提问来源于stack exchange,提问作者Jeremy Friesner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:57:04