Namespaces
Variants

std::piecewise_construct, std::piecewise_construct_t

Из ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Утилиты программы
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
 
Определён в заголовке <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 — это пустой класс-тег, используемый для разрешения неоднозначности между различными функциями, принимающими два кортежных аргумента.
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
**Примечания по переводу:** - HTML-теги, атрибуты и содержимое внутри ``, `
` тегов сохранены без изменений
- C++ специфические термины (Foo, tuple, pair, piecewise_construct и др.) не переводились
- Переведены только пользовательские текстовые элементы интерфейса:
  - "Run this code" → "Запустить этот код"
  - "Output:" → "Вывод:"
- Сохранено оригинальное форматирование и структура документа

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2510 C++11 конструктор по умолчанию был неявным, что могло приводить к неоднозначности сделан явным

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

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