std::piecewise_construct_t

来自cppreference.com
< cpp‎ | utility
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
std::pair
成员函数
(C++11)
非成员函数
(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20)
(C++11)
(C++11)
推导指引(C++17)
辅助类
(C++11)
 
在标头 <utility> 定义
struct piecewise_construct_t { explicit piecewise_construct_t() = default; };
(C++11 起)

std::piecewise_construct_t 是用于在接收二个 tuple 参数的不同函数间消歧义的空类标签类型。

不使用 std::piecewise_construct_t 的重载假设每个 tuple 参数各变成一个 pair 的元素。使用 std::piecewise_construct_t 的重载假设每个 tuple 参数用于逐块构造一个指定类型的新对象,而它将成为 pair 的元素。

示例

#include <iostream>
#include <utility>
#include <tuple>
 
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::pair<Foo, Foo> p1(t, t);
    std::pair<Foo, Foo> p2(std::piecewise_construct, t, t);
}

输出:

Constructed a Foo from a tuple
Constructed a Foo from a tuple
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

参阅

用于为逐段构造的函数消歧义的 piecewise_construct_t 类型的对象
(常量)
构造新的 pair
(std::pair<T1,T2> 的公开成员函数)