如果结构包含构造函数,则无法使用初始值设定项列表来赋值

Unable to use initializer list to assign values if structure contains a constructor

提问人: 提问时间:12/7/2021 更新时间:12/9/2021 访问量:337

问:

我正在使用初始值设定项列表创建对象并将其分配给带有键的地图。对于简单结构,可以使用初始值设定项列表创建临时结构。int

因此,我做这样的事情是完全有效的

struct fileJobPair {
        int file;
        int job;
};

map<int, fileJobPair> mp;
mp[1] = {10, 20};
mp[2] = {100, 200};
mp[3] = {1000, 2000};

但是如果我将构造函数添加到结构中,我会收到错误

file.cpp: In function ‘int main()’:
file.cpp:18:21: error: no match for ‘operator=’ (operand types are ‘std::map<int, fileJobPair>::mapped_type’ {aka ‘fileJobPair’} and ‘<brace-enclosed initializer list>’)
   18 |      mp[1] = {10, 20};
      |                     ^
file.cpp:4:8: note: candidate: ‘constexpr AfileJobPair& AfileJobPair::operator=(const AfileJobPair&)’
    4 | struct fileJobPair {
      |        ^~~~~~~~~~~~
file.cpp:4:8: note:   no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘const fileJobPair&’
file.cpp:4:8: note: candidate: ‘constexpr fileJobPair& fileJobPair::operator=(fileJobPair&&)’
file.cpp:4:8: note:   no known conversion for argument 1 from ‘<brace-enclosed initializer list>’ to ‘fileJobPair&&’

这是我尝试过的:

struct fileJobPair {
        int file;
        int job;
        fileJobPair()
        {
                file = job = 0;
        }
};

int main()
{
            map<int, fileJobPair> mp;
            mp[1] = {10, 20};
            mp[2] = {100, 200};
            mp[3] = {1000, 2000};
            for(int i =1;i<=3;i++)
            {
                cout<< mp[i].file <<" "<< mp[i].job<<endl;
             }
            return 0;
}

为什么我会收到错误,它到底是如何在内部工作的?

c++ std 运算符关键字 stdmap 初始值设定项列表

评论

1赞 Alan Birtles 12/7/2021
fileJobPair具有默认构造函数,因此不能使用初始化器来初始化它
0赞 12/7/2021
只有当我将构造函数添加到这个简单的结构中时,才会出现此问题。所以它到底是在内部工作吗
1赞 Daniel Langr 12/7/2021
这不是 .你会得到同样的.不同之处在于,一旦添加了自定义默认构造函数,它就不再是聚合。详情请看这里:en.cppreference.com/w/cpp/language/aggregate_initializationmapfileJobPair f; f = {10,20};fileJobPair
0赞 12/7/2021
@DanielLangr非常感谢,这让我的概念变得清晰起来。请写一个答案,我会接受的
0赞 12/7/2021
@DanielLangr riquefr 的回答不会使文档所说的内容无效吗?“没有用户声明的构造函数”

答:

0赞 riquefr 12/7/2021 #1

当你创建一个 ,默认情况下,它将使用你的空构造函数,因此将不再可用来完成。但是你可以向它添加一个新的构造函数,它接收 2 个整数并将它们绑定到相应的值,如下所示:fileJobPair{}

#include <iostream>
#include <map>

using namespace std;

struct fileJobPair {
        int file;
        int job;
        fileJobPair() {
            file = job = 0;
        }
        fileJobPair(int a, int b) {
            file = a;
            job = b;
        }
};

int main()
{
            map<int, fileJobPair> mp; 
            mp[1] = {10,10};
            mp[2] = {100, 200};
            mp[3] = {1000, 2000};
            for(int i =1;i<=3;i++)
            {
                cout<< mp[i].file <<" "<< mp[i].job<<endl;
             }
            return 0;
}

评论

0赞 12/7/2021
哦,但是当文档说时,这是如何工作的no user-declared constructors no user-provided constructors
0赞 riquefr 12/7/2021
我不知道允许它的 C++ 语言上的实现,但我认为这是因为它现在知道您可以使用 2 整数值来初始化结构,当您使用空构造函数时,它没有办法知道。