如何移除std::expected的[[nodiscard]]属性?
如何移除std::expected的[[nodiscard]]属性?
嘿,这个问题我升级VS2022的时候刚好碰到过!在最新的17.14版本里,微软给std::expected类模板加上了[[nodiscard]]属性,这就导致如果咱们直接调用返回std::expected的函数却不处理它的返回值,编译器就会弹出C4834的警告。比如你给出的这段代码:
#include <expected> std::expected<void,int> f() { return {}; } int main() { f(); }
就会触发这样的警告:
warning C4834: discarding return value of function with [[nodiscard]] attribute
下面给你几个实用的解决思路,你可以根据自己的场景选:
显式忽略返回值:这是最简单直接的办法,用
(void)强制转换返回值,明确告诉编译器“我就是故意忽略这个返回值的”。把main里的f();改成(void)f();就行,这样警告就会消失。自定义无[[nodiscard]]的包装类型:如果你的代码里经常需要忽略
std::expected的返回值,可以自己写个轻量的包装类,继承std::expected但不添加[[nodiscard]]属性。比如:
#include <expected> template<typename T, typename E> struct discardable_expected : std::expected<T, E> { // 继承std::expected的所有构造函数 using std::expected<T, E>::expected; }; discardable_expected<void, int> f() { return {}; } int main() { f(); // 这里不会触发警告 }
- 禁用特定警告:要是不想改代码,也可以直接禁用C4834这个警告。你可以在代码开头加上
#pragma warning(disable: 4834),或者在VS的项目设置里找「C/C++」→「高级」→「禁用特定警告」,输入4834就行。不过这个方法要谨慎用,不然可能会漏掉其他有用的[[nodiscard]]警告哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

