std::piecewise_construct, std::piecewise_construct_t
From cppreference.com
| ヘッダ <utility> で定義 |
||
| struct piecewise_construct_t { explicit piecewise_construct_t() = default; }; |
(1) | (C++11以降) |
| constexpr std::piecewise_construct_t piecewise_construct{}; |
(2) | (C++11以降) (C++17以降インライン化) |
1)
std::piecewise_construct_t は、2つのタプル引数を持つ異なる関数を区別するために使用される空のクラスタグ型です。2) 定数
std::piecewise_construct は、(1) のインスタンスです。std::piecewise_construct_t を使用しないオーバーロードは、各タプル引数がペアの要素になると想定します。std::piecewise_construct_t を使用するオーバーロードは、各タプル引数が、指定された型の新しいオブジェクトをピースワイズ(要素ごとに)構築するために使用され、それがペアの要素になると想定します。
目次 |
[編集] 標準ライブラリ
以下の標準ライブラリの型および関数は、区別タグとしてこれを使用しています。
| 二項タプル、つまり値のペアを実装する (クラステンプレート) | |
| 与えられた型が必要とする uses-allocator 構築の種類に一致する引数リストを準備します (関数テンプレート) | |
同じ値を繰り返し生成することで得られるシーケンスからなる view(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
[編集] 例
このコードを実行
#include <iostream> #include <tuple> #include <utility> struct Foo { Foo(std::tuple<int, float>) { std::cout << "Constructed a Foo from a tuple\n"; } Foo(int, float) { std::cout << "Constructed a Foo from an int and a float\n"; } }; int main() { std::tuple<int, float> t(1, 3.14); std::cout << "Creating p1...\n"; std::pair<Foo, Foo> p1(t, t); std::cout << "Creating p2...\n"; std::pair<Foo, Foo> p2(std::piecewise_construct, t, t); }
出力
Creating p1... Constructed a Foo from a tuple Constructed a Foo from a tuple Creating p2... Constructed a Foo from an int and a float Constructed a Foo from an int and a float
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2510 | C++11 | デフォルトコンストラクタが非明示的であり、曖昧さを引き起こす可能性がありました | 明示的にされました |
[編集] 関連項目
| 新しいペアを構築します。 ( std::pair<T1,T2> の公開メンバ関数)
|