std::use_facet
来自cppreference.com
在标头 <locale> 定义
|
||
template< class Facet > const Facet& use_facet( const std::locale& loc ); |
||
获得到 loc 实装的刻面的引用。
如果 Facet
不是定义中包含公开静态成员 id
的刻面或者是有 volatile 限定的刻面,那么程序非良构。
参数
loc | - | 要查询的本地环境对象 |
返回值
返回到刻面的引用。此函数返回的引用在有引用该刻面的 std::locale 对象存在的期间保持合法。
异常
在 std::has_facet<Facet>(loc) == false 的情况下抛出 std::bad_cast。
注解
如果由 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"}; // OK:非临时对象 auto& f = std::use_facet<std::moneypunct<char, true>>(loc); foo(f.curr_symbol()); // OK: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 << "你的金额字符串是 " << std::use_facet<std::moneypunct<char, true>>(std::locale{name}). curr_symbol() << '\n'; }
输出:
你的金额字符串是 USD 你的金额字符串是 EUR 你的金额字符串是 GBP
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 31 | C++98 | 返回的引用在该本地环境值存在的期间保持合法 | 返回的引用在有引用该平面的本地环境对象存在的期间保持合法 |
LWG 38 | C++98 | Facet 不需要有直接成员 id
|
需要 |
LWG 436 | C++98 | 不明确 Facet 是否可以有 cv 限定
|
可以有 const 限定,但不能有 volatile 限定 |
参阅
一组用来封装文化差异的多态刻面的集合 (类) | |
检查本地环境是否实现特定的刻面 (函数模板) |