1
4
现行标准(C++ 03)中的重要内容似乎是§8.5.3,解释了如何初始化引用(在这些引号中,
因此,即使实现将引用直接绑定到临时对象,复制构造函数也必须是可访问的。
第一种情况适用,引用“直接绑定”到初始值设定项表达式。 |
2
3
所以你用的是“复制初始化”:
在13.3.1.3“构造函数初始化”中,所选构造函数的重载为:
因此,对于复制初始化,复制构造函数必须可用。但是,允许编译器“优化”副本: 12.2/1临时物体
您可以通过避免复制初始化和使用直接初始化来获得所需的效果:
注: 由于新版本的GCC显然有不同的行为,我想我应该发布这个注释,它可能会解决这个差异(两种行为仍然符合标准): 8.5.3/5参考文献指出:
我最初读了最后一句话(“将要使用的构造函数…”)来应用于这两个选项,但也许它应该被理解为只应用于seconds选项——或者至少GCC维护人员是这样读的。 我不确定这是否是GCC版本的不同行为之间发生的事情(欢迎评论)。我们的语言律师技能已经达到极限了。。。 |
3
1
我认为这确实是一个编译器错误,gcc似乎认为这是复制初始化。改用直接初始化:
复制初始化中的复制构造函数调用总是被优化掉(复制省略的一个实例),然后就不必可用了。 |