Namespaces
Variants

std:: piecewise_construct, std:: piecewise_construct_t

From cppreference.net
Utilities library
Определено в заголовке <utility>
struct piecewise_construct_t { explicit piecewise_construct_t ( ) = default ; } ;
(1) (начиная с C++11)
constexpr std:: piecewise_construct_t piecewise_construct { } ;
(2) (начиная с C++11)
(inline начиная с C++17)
1) std::piecewise_construct_t — это пустой класс-тег, используемый для различения между различными функциями, принимающими два аргумента типа tuple.
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 конструктор по умолчанию был неявным, что могло приводить к неоднозначности сделан явным

Смотрите также

создаёт новый pair
(публичная функция-член std::pair<T1,T2> )