std:: use_facet
|
Определено в заголовочном файле
<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-квалифицированным |
Смотрите также
|
набор полиморфных фацетов, инкапсулирующих культурные различия
(класс) |
|
|
проверяет, реализует ли локаль определенный фацет
(шаблон функции) |