C++ 属性:nodiscard (C++17 起)

< cpp‎ | language‎ | attributes

若从并非转型到 void弃值表达式中,调用声明为 nodiscard 的函数,或调用按值返回声明为 nodiscard 的枚举或类的函数,则鼓励编译器发布警告。

语法

[[nodiscard]] (1)
[[nodiscard( 字符串字面量 )]] (2) (C++20 起)
字符串字面量 - 能用于解释结果不应被舍弃的理由的文本

解释

出现在函数声明、枚举声明或类声明中。

若从并非转型到 void弃值表达式中,

  • 调用声明为 nodiscard 的函数,或
  • 调用按值返回声明为 nodiscard 的枚举或类的函数,或
  • 显式类型转换static_cast 形式调用声明为 nodiscard 的构造函数,或
  • 显式类型转换static_cast 形式构造声明为 nodiscard 的枚举或类的对象,

则鼓励编译器发布警告。

若指定了 字符串字面量,则它通常被包含于警告中。

(C++20 起)

示例

struct [[nodiscard]] error_info { };
error_info enable_missile_safety_mode();
void launch_missiles();
void test_missiles() {
   enable_missile_safety_mode(); // 编译器可在舍弃 nodiscard 值时发布警告
   launch_missiles();
}
error_info& foo();
void f1() {
    foo(); // 并非按值返回 nodiscard 类型,无警告
}


缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
P1771R1 C++17 构造函数上的 nodiscard 无效果 若舍弃该对象则能导致警告

标准库

下列标准函数声明为带 nodiscard 属性:

分配函数
分配函数
(函数)
分配未初始化的存储
(std::allocator<T> 的公开成员函数)
[静态]
用分配器分配未初始化的存储
(std::allocator_traits<Alloc> 的公开静态成员函数)
分配内存
(std::pmr::memory_resource 的公开成员函数)
分配内存
(std::pmr::polymorphic_allocator<T> 的公开成员函数)
用外层分配器分配未初始化存储
(std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...> 的公开成员函数)
间接访问
(C++17)
指针优化屏障
(函数模板)
告知编译器指针已对齐
(函数模板)
检查是否为空的函数
(C++17)
检查容器是否为空
(函数模板)
检查结点柄是否为空
(node handle 的公开成员函数)
检查容器是否为空
(std::array<T,N> 的公开成员函数)
检查字符串是否为空
(std::basic_string<CharT,Traits,Allocator> 的公开成员函数)
检查视图是否为空
(std::basic_string_view<CharT,Traits> 的公开成员函数)
检查容器是否为空
(std::deque<T,Allocator> 的公开成员函数)
检查容器是否为空
(std::forward_list<T,Allocator> 的公开成员函数)
检查容器是否为空
(std::list<T,Allocator> 的公开成员函数)
检查容器是否为空
(std::map<Key,T,Compare,Allocator> 的公开成员函数)
检查匹配是否成功
(std::match_results<BidirIt,Alloc> 的公开成员函数)
检查容器是否为空
(std::multimap<Key,T,Compare,Allocator> 的公开成员函数)
检查容器是否为空
(std::multiset<Key,Compare,Allocator> 的公开成员函数)
检查底层的容器是否为空
(std::priority_queue<T,Container,Compare> 的公开成员函数)
检查底层的容器是否为空
(std::queue<T,Container> 的公开成员函数)
检查容器是否为空
(std::set<Key,Compare,Allocator> 的公开成员函数)
检查序列是否为空
(std::span<T,Extent> 的公开成员函数)
检查底层的容器是否为空
(std::stack<T,Container> 的公开成员函数)
检查容器是否为空
(std::unordered_map<Key,T,Hash,KeyEqual,Allocator> 的公开成员函数)
检查容器是否为空
(std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator> 的公开成员函数)
检查容器是否为空
(std::unordered_multiset<Key,Hash,KeyEqual,Allocator> 的公开成员函数)
检查容器是否为空
(std::unordered_set<Key,Hash,KeyEqual,Allocator> 的公开成员函数)
检查容器是否为空
(std::vector<T,Allocator> 的公开成员函数)
检查路径是否为空
(std::filesystem::path 的公开成员函数)
杂项
(C++11)
异步运行一个函数(有可能在新线程中执行),并返回保有其结果的 std::future
(函数模板)