std:: use_facet
|
定义于头文件
<locale>
|
||
|
template
<
class
Facet
>
const Facet & use_facet ( const std:: locale & loc ) ; |
||
获取由 loc 实现的刻面的引用。
如果 Facet 不是在其定义中包含公开静态成员
id
的
facet
,或者它是 volatile 限定的 facet,则程序是非良构的。
目录 |
参数
| loc | - | 要查询的区域设置对象 |
返回值
返回对该facet的引用。只要任何 std::locale 对象引用该facet,此函数返回的引用就保持有效。
异常
std::bad_cast 若 std:: has_facet < Facet > ( loc ) == false 。
注释
当从
use_facet
获取的
Facet
对象引用需要在语句结束后继续使用时,
std::locale
对象不应是临时对象:
// 错误示例: auto& f = std::use_facet<std::moneypunct<char, true>>(std::locale{"no_NO.UTF-8"}); foo(f.curr_symbol()); // 错误:f内部使用了悬垂引用 // 指向已不存在的std::locale对象 // 正确示例: auto loc = std::locale{"is_IS.UTF-8"}; // 正确:非临时对象 auto& f = std::use_facet<std::moneypunct<char, true>>(loc); foo(f.curr_symbol()); // 正确:f内部使用了对现有locale对象的有效引用
示例
显示用户首选区域设置使用的3字母货币名称。
#include <iostream> #include <locale> int main() { for (const char* name: {"en_US.UTF-8", "de_DE.UTF-8", "en_GB.UTF-8"}) std::cout << "Your currency string is " << std::use_facet<std::moneypunct<char, true>>(std::locale{name}). curr_symbol() << '\n'; }
输出:
Your currency string is USD Your currency string is EUR Your currency string is GBP
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用标准 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 31 | C++98 | 返回的引用在locale值本身存在期间保持可用 | 返回的引用在至少有一个locale对象引用该facet期间保持可用 |
| LWG 38 | C++98 |
未要求
Facet
必须具有直接成员
id
|
要求必须具有 |
| LWG 436 | C++98 |
未明确说明
Facet
是否可带有cv限定符
|
可带有const限定符,但不能带有volatile限定符 |
参见
|
封装文化差异的多态facet集合
(类) |
|
|
检查locale是否实现特定facet
(函数模板) |