如您所述,gcc确实知道该语法的含义,并给出了特定的错误消息:
cannot convert ‘const X’ to ‘int’ in initialization
这是因为花括号{}
触发列表初始化和聚合类型的列表初始化(你struct X
是一个聚合,如果你不知道为什么,只是想“像一个数组,它只是包含没有任何行为的东西”)执行聚合初始化。聚合初始化意味着初始化器按顺序与数据成员配对,并且任何额外的数据成员都会初始化值。
x_.a
与x
x_.b
配对 与无配对,因此值已初始化
这不是你想要的,因为你不能完全x
投入x_.a
(这是 gcc 告诉你的)。您想要的是使用复制构造函数直接初始化,写为_x(x)
.
Visual C++ 中的故事有点不同。Microsoft 工程师仍在努力添加 C++11 支持,这是他们尚未完成的事情之一(至少在您的版本中)。编译器知道当它{}
在 ctor 初始化器列表中看到时,这意味着列表初始化,但它不知道如何做到这一点,所以它放弃了。
特别是,它没有达到X
将初始化程序与数据成员配对,并找出是否可以配对x_.a
的x
程度。
当编译器告诉你“这没有实现”时,这并不意味着代码是好的,也不意味着代码是坏的。这意味着编译代码需要尚未发布的逻辑(可能尚未编写,可能尚未测试,Microsoft 以外的人都不知道)。你的代码被送到工厂,装载在传送带上,开始沿着装配线移动,然后……从传送带的末端掉下来,因为处理这种代码的机器还没有在工厂里. 没有人知道如果机器在那里捡起它,它会不会把它丢在错误堆里,或者把它放在另一个传送带上。