Namespaces
Variants

std:: use_facet

From cppreference.net
Определено в заголовочном файле <locale>
template < class Facet >
const Facet & use_facet ( const std:: locale & loc ) ;

Получает ссылку на аспект, реализованный loc .

Программа является некорректной, если Facet не является facet , определение которого содержит открытый статический член id или если это facet с квалификатором volatile.

Содержание

Параметры

loc - объект локали для запроса

Возвращаемое значение

Возвращает ссылку на фасет. Ссылка, возвращаемая этой функцией, действительна до тех пор, пока любой std::locale объект ссылается на этот фасет.

Исключения

std::bad_cast если std:: has_facet < Facet > ( loc ) == false .

Примечания

Объект std::locale не должен быть временным, если ссылка на объект Facet , полученный из use_facet , используется после завершения выражения:

// НЕПРАВИЛЬНО:
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 внутри использует ссылку на существующий объект локали.

Пример

Отобразить 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-квалифицированным может быть const-квалифицированным, но не volatile-квалифицированным

Смотрите также

набор полиморфных фацетов, инкапсулирующих культурные различия
(класс)
проверяет, реализует ли локаль определенный фацет
(шаблон функции)