问题标签 [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.
c# - C# 中的 nodiscard 属性
我正在寻找一种方法,使方法的用户忽略方法的返回对象/值是非法的。在 C++ 中,这可以通过[[nodiscard]]
属性实现。但是,我在 C# 中找不到类似的属性。是否有此类属性的标准实现或关于如何实现此行为的约定?
作为一个例子,为什么这可能有用(并且例外不是合适的方式是:
是的,这也可以用 来完成else
,但我真的不喜欢代码中的深层嵌套。
c++ - 尝试 [[nodiscard]] 没有成功
我正在尝试测试一点 C++17。我正在尝试做:
但是,事实并非如此。我正在使用 Visual Studio 2017。警告级别设置为 Level4(\W4)。我已将 C++ 语言标准设置为 ISO C++ 最新草案标准 (/std:c++latest)。
但它不会产生我想要的警告。这是为什么?另外,还有一个小问题:选择语言标准的选项卡仅出现在调试配置中,而不出现在发布中。这是为什么?Release 在 nodiscard 上抱怨,这是否意味着 Release 在 C++14 中?
编辑:当然我的意思是第二部分的警告。已更正。:)
c++ - 在 C++17 之前指定 [[nodiscard]] 的方法
[[nodiscard]]
我需要非 C++17 代码库中属性的语义。我想在 C++17 之前有一些依赖于编译器的方法来实现这一点。有人知道这些吗?我对 clang、gcc 和 MSVC 感兴趣。
c++ - 为什么不将 new 运算符声明为 [[nodiscard]]?
C++17[[nodiscard]]
在p0189r1中引入了新属性。当使用此属性修饰函数时,不得丢弃返回类型。如果它被丢弃,则会发出警告。
例子:
对于任何返回任何以后必须再次释放/销毁/删除/...的函数来说,这似乎是一个很好的补充。然而,标准并没有改变全局 new 操作符的定义来使用这个新的注解。这有什么好的理由吗?
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
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 代码并说:
(完整的警告输出见下文)
编译器版本:
我的理论是这个警告是由以下原因引起的:
- Visual C++ 实现
push_back
方面emplace_back
, emplace_back
在 C++17 中返回一个引用,并且_HAS_CXX17
如果设置了宏,那么在 Visual C++ 中后一个函数的实现有点奇怪(对我来说) 。
但是,不管任何内部库代码如何,Visual C++ 在生成这些诊断消息时是否违反了标准?wandbox.org 上最新的 Clang 和 GCC 版本不会对相同的代码产生任何警告。
nodiscard
我坚持认为用户类型的库内部用法S
永远不会引起警告,因为这会使该功能在实践中无法使用,但nodiscard
§10.6.7/2 [dcl.attr.nodiscard] 中的简短描述有点含糊那个话题。
还是该标准只是简单地“阻止”此类警告,而这确实是一个 QoI 问题,尽管在这种情况下是一个相当严重的问题,但严重到应该将其作为错误报告提交给 Microsoft?
这是完整的警告:
c++ - 如何故意丢弃 [[nodiscard]] 返回值?
说我有
然后
但如果
然后
有没有一种干净的方式告诉编译器“我想丢弃这个[[nodiscard]]
值”?
c++ - 我可以用 'using' 声明一个类型 [[nodiscard]] 吗?
[[nodiscard]]
您可以使用该属性声明一个类。当您从此类的语义中知道每当它从函数返回时,它可能很有用,它必须用于某事。我就是这种情况,用[[nodiscard]]
而不是每个返回它的单独函数来标记类会非常方便。但是,有一个并发症。这是我需要制作的类型[[nodiscard]]
:
是否有将 my ConnectionStruct
as标记为的语法[[nodiscard]]
?
c++ - [[nodiscard]] 指向函数指针
我想使用第三方函数,它通过一个充满函数指针的结构提供它的 API。例如:
第三方库初始化这个结构。需要检查这些函数(func1、func2)的返回值,我希望我能以某种方式体现在[[discard]]
属性上以确保检查返回值。
有什么办法可以做到这一点,同时保持结构的 ABI?
编辑:到目前为止,我能想到的最好的方法是拥有另一个结构,如下所示:
我希望有更好的东西
c++ - 为什么 [[nodiscard]] 不适用于参考?
当函数返回引用时,该属性[[nodiscard]]
似乎不起作用。
此代码给出了预期的警告:
但是,即使使用以下代码,此代码也可以毫无问题地编译-Wall -Wextra -pedantic
:
两者之间的唯一区别是该函数在第二个测试中返回一个引用。
我的编译器版本是g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
.
这是编译器中的正确行为还是错误?如果这是故意的,那是什么原因呢?