如何初始化 std::map 中的就地键值对

问题描述 投票:0回答:1

我想将键值对插入到

std::map
中,其中
uint32_t
作为键类型和值的自定义类型。根据std::map
文档
,我编写了以下代码:

#include <cstdint>
#include <iostream>
#include <map>

struct Values
{
        uint32_t a = 0;
        uint32_t b = 0;

        Values(uint32_t _x, uint32_t _y): a(_x), b(_y)
        {
            std::cout << __func__ << "(" << _x << ", " << _y ")" << std::endl;
        }
};

int main()
{
        std::map<uint32_t, Values> data;
        for(uint32_t i = 0; i < 100; i++)
                data.emplace(i, std::forward_as_tuple(i, i));

        return 0;
}

我正在通过运行

gcc
来编译代码

gcc -O3 -std=c++23 -Wconversion -Wall -Wextra -Wpedantic -fanalyzer 

但是,此代码无法编译。

这是编译器资源管理器的链接,您可以在其中查看

gcc
的完整输出。

gcc
正在抱怨:

error: no matching function for call to 'construct_at(std::pair<const unsigned int, Values>*&, unsigned int&, std::tuple<unsigned int&, unsigned int&>)'

为什么我会收到此错误以及如何修复此错误?

c++ stl stdmap c++23
1个回答
0
投票

尝试指定

std::piecewise_construct
(请参阅https://en.cppreference.com/w/cpp/utility/tuple/forward_as_tuple中的示例),例如:

m.emplace(std::piecewise_construct,
          std::forward_as_tuple(i),
          std::forward_as_tuple(i, i));
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.