命名空间
变体
操作

std::use_facet

来自 cppreference.com
< cpp‎ | locale
定义在头文件 <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 限定的 可以是常量限定的,但不能是易变限定的

[编辑] 另请参阅

封装文化差异的多态面集
(类) [编辑]
检查区域设置是否实现了特定面
(函数模板) [编辑]