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 |
См. также
| набор полиморфных фасетов, инкапсулирующих культурные различия (класс) |
|
| проверяет, реализует ли локаль конкретный фасет (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/use_facet