Spec-Zone.ru › C++

std::use_facet

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

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

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

Параметры

loc - объект локали, который нужно запросить

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

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

Исключения

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

Примечания

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

// 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.

Пример

Выводит трёхбуквенное название валюты, используемое в предпочитаемой локали пользователя.

#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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/use_facet

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API