std::callonce
时间: 2023-08-22 17:06:53 浏览: 164
C++11中std::move、std::forward、左右值引用、移动构造函数的测试问题
引用\[1\]中提到了std::call_once的详细用法。当std::call_once被调用时,如果标志flag表明函数f已经被调用过了,那么std::call_once会立即返回(这种调用被称为被动调用)。否则,std::call_once会使用参数std::forward<Callable>(f)和std::forward<Args>(args)调用函数f(就像通过std::invoke一样)。与std::thread构造函数或std::async不同,参数不会被移动或复制,因为它们不需要传递到另一个执行线程中(这种调用被称为主动调用)。如果该调用抛出异常,则异常会传播给std::call_once的调用者,并且标志不会翻转,以便尝试另一次调用(这种调用被称为异常调用)。如果该调用正常返回(这种调用被称为返回调用),标志会翻转,并且对于相同标志的所有其他std::call_once调用都保证是被动调用。
引用\[2\]和\[3\]提供了一些使用std::call_once的示例代码。在这些示例中,std::call_once与std::once_flag配合使用,以确保函数只被调用一次。在示例\[2\]中,staticData是一个静态变量,initializeStaticData函数用于初始化staticData,而foo函数中的std::call_once确保initializeStaticData只被调用一次。在示例\[3\]中,Initialize函数被std::call_once调用,确保它只被执行一次。
综上所述,std::call_once是一个用于确保函数只被调用一次的函数模板,它可以与std::once_flag一起使用。
#### 引用[.reference_title]
- *1* *3* [C++11特性之std:call_once介绍](https://blog.csdn.net/renhui1112/article/details/124735648)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *2* [std::call_once()函数详解](https://blog.csdn.net/u012372584/article/details/96867805)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
阅读全文