Namespaces
Variants

std:: use_facet

From cppreference.net
定义于头文件 <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
(函数模板)