Spec-Zone.ru › C++

std::piecewise_construct, std::piecewise_construct_t

Определён в заголовочном файле <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, предполагают, что каждый аргумент-кортеж применяется для поэлементного конструирования нового объекта указанного типа, который станет элементом пары.

Стандартная библиотека

Следующие типы и функции стандартной библиотеки используют его как тег для устранения неоднозначности:

pair
реализует бинарный кортеж, то есть пару значений
(шаблон класса)
uses_allocator_construction_args
(C++20)
подготавливает список аргументов, соответствующий способу конструирования с использованием аллокатора, необходимому для заданного типа
(шаблон функции)
ranges::repeat_viewviews::repeat
(C++23)
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++.

Отчёт об ошибке Применяется к Опубликованное поведение Исправленное поведение
LWG 2510 C++11 конструктор по умолчанию не был explicit, что могло приводить к неоднозначности сделан explicit

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/piecewise_construct

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API