std::use_facet
来自 cppreference.com
定义在头文件 <locale> 中 |
||
template< class Facet > const Facet& use_facet( const std::locale& loc ); |
||
获取由 loc 实现的面引用。
如果 Facet 不是定义包含公共静态成员 id
的面,或它是易变限定的面,则程序格式错误。
内容 |
[编辑] 参数
loc | - | 要查询的区域设置对象 |
[编辑] 返回值
返回对面的引用。只要任何 std::locale 对象引用该面,此函数返回的引用就有效。
[编辑] 异常
std::bad_cast 如果 std::has_facet<Facet>(loc) == false.
[编辑] 注释
如果在语句结束之后使用从 use_facet
获取的 Facet
对象的引用,则 std::locale 对象不应该是一个临时对象。
// BAD: auto& f = std::use_facet<std::moneypunct<char, true>>(std::locale{"no_NO.UTF-8"}); foo(f.curr_symbol()); // Error: f internally uses a dangling reference // to a std::locale object that no longer exists. // GOOD: auto loc = std::locale{"is_IS.UTF-8"}; // OK: a non-temporary object auto& f = std::use_facet<std::moneypunct<char, true>>(loc); foo(f.curr_symbol()); // OK: f internally uses a reference to existing locale object.
[编辑] 示例
显示用户首选区域设置使用的 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++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 31 | C++98 | 返回的引用仍然可用 只要区域设置值本身存在 |
返回的引用仍然可用,只要 某个区域设置对象引用该面 |
LWG 38 | C++98 | Facet 不需要具有直接成员 id |
需要 |
LWG 436 | C++98 | 不清楚 Facet 是否可以是 cv 限定的 |
可以是常量限定的,但不能是易变限定的 |
[编辑] 另请参阅
封装文化差异的多态面集 (类) | |
检查区域设置是否实现了特定面 (函数模板) |