解决:error C2440: “初始化”: 无法从“initializer list”转换为……

1.情景重现

遇到这样一个报错“error C2440: “初始化”: 无法从“initializer list”转换”。

出问题的功能是用列表初始化一个结构体数组。因这样写起来很简练,充满诱惑,故还是想保留这个写法

	struct Test
	{
		LPCWSTR testName = L"";
		int		testValue = 0;
	};

	Test tests[] = {
		{ L"Test1", 100 },
		{ L"Test2", 100 }
	};

结构体实现了一个初始化变量的代码,看起来似乎完美,省去了构造函数的一堆代码,又确保了安全性。数组也省掉了对每个结构体单独赋初值的操作。但是就是无法编译通过。

2.建议方法

网上提供的解决办法是添加一个初始化列表:

看起来似乎可行。但是这个结构体并不是一个单独类型的列表。

3.最终方案

最终方案并不是添加构造函数,而是去掉初始化代码,问题解决。

	struct Test
	{
		LPCWSTR testName/* = L""*/;
		int		testValue/* = 0*/;
	};

	Test tests[] = {
		{ L"Test1", 100 },
		{ L"Test2", 100 }
	};

反思

结构体加了变量初始化代码后,其实就已经变成了一个不再是原始的结构体的,而是有一堆编译器背后生成了的代码的复杂对象。这个时候通过去掉初始化变量的代码,反而让它回归成一个类似C的原始结构体。大道至简,要深刻理解其中的机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值