问题标签 [nodiscard]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1016 浏览

c# - C# 中的 nodiscard 属性

我正在寻找一种方法,使方法的用户忽略方法的返回对象/值是非法的。在 C++ 中,这可以通过[[nodiscard]]属性实现。但是,我在 C# 中找不到类似的属性。是否有此类属性的标准实现或关于如何实现此行为的约定?

作为一个例子,为什么这可能有用(并且例外不是合适的方式是:

是的,这也可以用 来完成else,但我真的不喜欢代码中的深层嵌套。

0 投票
1 回答
606 浏览

c++ - 尝试 [[nodiscard]] 没有成功

我正在尝试测试一点 C++17。我正在尝试做:

但是,事实并非如此。我正在使用 Visual Studio 2017。警告级别设置为 Level4(\W4)。我已将 C++ 语言标准设置为 ISO C++ 最新草案标准 (/std:c++latest)。

但它不会产生我想要的警告。这是为什么?另外,还有一个小问题:选择语言标准的选项卡仅出现在调试配置中,而不出现在发布中。这是为什么?Release 在 nodiscard 上抱怨,这是否意味着 Release 在 C++14 中?

编辑:当然我的意思是第二部分的警告。已更正。:)

0 投票
1 回答
1477 浏览

c++ - 在 C++17 之前指定 [[nodiscard]] 的方法

[[nodiscard]]我需要非 C++17 代码库中属性的语义。我想在 C++17 之前有一些依赖于编译器的方法来实现这一点。有人知道这些吗?我对 clang、gcc 和 MSVC 感兴趣。

0 投票
1 回答
205 浏览

c++ - 为什么不将 new 运算符声明为 [[nodiscard]]?

C++17[[nodiscard]]p0189r1中引入了新属性。当使用此属性修饰函数时,不得丢弃返回类型。如果它被丢弃,则会发出警告。

例子:

对于任何返回任何以后必须再次释放/销毁/删除/...的函数来说,这似乎是一个很好的补充。然而,标准并没有改变全局 new 操作符的定义来使用这个新的注解。这有什么好的理由吗?

0 投票
4 回答
2302 浏览

c++ - 在特殊情况下是否可以忽略 [[nodiscard]] ?

C++17 有一个新属性,[[nodiscard]].

假设我有一个Result结构,它具有以下属性:

现在,如果我调用一个返回的函数,Result如果我不检查返回的,我会收到一个警告Result

该程序生成:

警告:忽略使用“nodiscard”属性声明的函数的返回值 [-Wunused-result]

到目前为止,一切都很好。现在假设,我有一个特殊的功能,我仍然想返回Result,但我不希望生成这个警告,如果检查被省略:

这是因为,someNonCriticalFunction()做了一些非关键的事情(例如,像printf- 我打赌没有人printf一直检查 ' 的返回值);大多数情况下,我不在乎它是否失败。但我仍然希望它返回Result,因为在极少数情况下,我确实需要它的Result.

有可能以某种方式做到这一点吗?


我不喜欢的可能解决方案:

  • 我不喜欢叫它 as (void)someNonCriticalFunction(),因为这个函数被调用了很多次,很尴尬
  • 创建一个包装器someNonCriticalFunction(),它调用(void)someNonCriticalFunction():我不想仅仅因为这个而有一个不同命名的函数
  • 从 Result 中删除[[nodiscard]],并将其添加到每个返回的函数中Result
0 投票
2 回答
7776 浏览

c++ - 自 Visual Studio 15.6.2 编译器更新后的新 C++17 [[nodiscard]] 警告是否符合标准?

最近的 Visual Studio Studio 升级到版本 15.6.2 包括一个 Visual C++ 编译器更新,该更新导致以下代码在该push_back行出现警告,原因是[[nodiscard]]

像这样调用编译器(请注意,无需指定高警告级别即可重现,但这/std:c++latest是必需的,并且/permissive-是可选的):

警告来自 Visual C++ 自己的std::vector-implementation 代码并说:

(完整的警告输出见下文)

编译器版本:

我的理论是这个警告是由以下原因引起的:

  1. Visual C++ 实现push_back方面emplace_back
  2. emplace_back在 C++17 中返回一个引用,并且
  3. _HAS_CXX17如果设置了宏,那么在 Visual C++ 中后一个函数的实现有点奇怪(对我来说) 。

但是,不管任何内部库代码如何,Visual C++ 在生成这些诊断消息时是否违反了标准?wandbox.org 上最新的 Clang 和 GCC 版本不会对相同的代码产生任何警告。

nodiscard我坚持认为用户类型的库内部用法S永远不会引起警告,因为这会使该功能在实践中无法使用,但nodiscard§10.6.7/2 [dcl.attr.nodiscard] 中的简短描述有点含糊那个话题。

还是该标准只是简单地“阻止”此类警告,而这确实是一个 QoI 问题,尽管在这种情况下是一个相当严重的问题,但严重到应该将其作为错误报告提交给 Microsoft?


这是完整的警告:

0 投票
6 回答
14457 浏览

c++ - 如何故意丢弃 [[nodiscard]] 返回值?

说我有

然后

但如果

然后

有没有一种干净的方式告诉编译器“我想丢弃这个[[nodiscard]]值”?

0 投票
1 回答
129 浏览

c++ - 我可以用 'using' 声明一个类型 [[nodiscard]] 吗?

[[nodiscard]]您可以使用该属性声明一个类。当您从此类的语义中知道每当它从函数返回时,它可能很有用,它必须用于某事。我就是这种情况,用[[nodiscard]]而不是每个返回它的单独函数来标记类会非常方便。但是,有一个并发症。这是我需要制作的类型[[nodiscard]]

是否有将 my ConnectionStructas标记为的语法[[nodiscard]]

0 投票
1 回答
236 浏览

c++ - [[nodiscard]] 指向函数指针

我想使用第三方函数,它通过一个充满函数指针的结构提供它的 API。例如:

第三方库初始化这个结构。需要检查这些函数(func1、func2)的返回值,我希望我能以某种方式体现在[[discard]]属性上以确保检查返回值。

有什么办法可以做到这一点,同时保持结构的 ABI?

编辑:到目前为止,我能想到的最好的方法是拥有另一个结构,如下所示:

我希望有更好的东西

0 投票
0 回答
176 浏览

c++ - 为什么 [[nodiscard]] 不适用于参考?

当函数返回引用时,该属性[[nodiscard]]似乎不起作用。

此代码给出了预期的警告:

但是,即使使用以下代码,此代码也可以毫无问题地编译-Wall -Wextra -pedantic

两者之间的唯一区别是该函数在第二个测试中返回一个引用。

我的编译器版本是g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0.

这是编译器中的正确行为还是错误?如果这是故意的,那是什么原因呢?