std:: use_facet
|
ヘッダーで定義
<locale>
|
||
|
template
<
class
Facet
>
const Facet & use_facet ( const std:: locale & loc ) ; |
||
loc によって実装されたファセットへの参照を取得します。
プログラムは、Facetが
facet
であり、その定義にpublic staticメンバ
id
を含んでいない場合、またはvolatile修飾されたfacetである場合、不適格(ill-formed)です。
目次 |
パラメータ
| loc | - | クエリするロケールオブジェクト |
戻り値
ファセットへの参照を返します。この関数によって返される参照は、いずれかの std::locale オブジェクトがそのファセットを参照している限り有効です。
例外
std::bad_cast がスローされる条件: std:: has_facet < Facet > ( loc ) == false の場合。
注記
std::locale
オブジェクトは、
use_facet
から取得した
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は内部で既存の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++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 31 | C++98 |
返された参照はロケール値自体が存在する限り
使用可能であった |
返された参照は、何らかのロケールオブジェクトが
そのファセットを参照している限り使用可能 |
| LWG 38 | C++98 |
Facet
が直接のメンバ
id
を持つことが要求されていなかった
|
要求される |
| LWG 436 | C++98 |
Facet
がCV修飾可能か不明確であった
|
const修飾可能だが、volatile修飾は不可 |
関連項目
|
文化的差異をカプセル化する多相的なファセットの集合
(クラス) |
|
|
ロケールが特定のファセットを実装しているかチェックする
(関数テンプレート) |