|
|
1
4
在这种情况下,我敢不同意科莫的观点。实际上,以下代码未能按预期编译,因为将右值绑定到常量引用需要可访问的复制构造函数。
根据8.5.3/2,“[…]传递的参数(5.2.2)和函数值返回(6.6.3)是初始化,”因此,代码的格式应不正确。 编辑: 我仍然坚信,代码是根据C++ 03的错误格式形成的。不过,我刚刚阅读了C++ 0x工作草案的相关部分,看来它不再需要复制构造函数可用了。也许这就是从GCC-4.2迁移到GCC-4.3时代码开始编译的原因。
编辑:
为了澄清原因
编辑: 关于C++ 03和C++ 0x的区别,LITB很好地找到了 relevant defect report . |
|
|
2
1
如果没有可用的复制构造函数,则旧的g++编译器似乎无法通过引用传递临时对象:
|
|
|
3
1
我认为它是C++中的标准一致代码,而不是C++ 03。 我将测试命名为“从右值复制构造”。 据报道这是一个错误,但海湾合作委员会的人认为 here 这是正确的行为,并提供了标准的参考。 [DCL.初始参考]/5,项目符号2,子项目符号1
C++0x标准消除了歧义,而引用总是与由rValo表示的对象绑定,不需要构造函数是可访问的。 |
|
|
4
0
我不能给你指出标准的某个特定部分,但我认为它是可以接受的,并与 Comeau C++ 以及编译程序 提到。至于这样一个测试的名称,我想“编译器兼容性”和其他测试一样好。 |
|
|
5
0
这是有效的。调用b()构造一个b对象;调用b的默认编译器生成的公共构造函数。 构造C对象时,将构造一个对象。因为它是一个值,所以将考虑静态类型,并且将对从派生并用于复制构造对象的任何对象进行切片。类A具有编译器提供的公共副本构造函数。编译器发现B对象也是A类型的。编译器只关心复制构造A对象,它知道可以这样做,所以它使用复制构造函数将B对象中的A对象复制到C::M_A对象。ie由于静态类型而切片。 观察这些物体的记忆是有指导意义的。将char*数据成员放在初始化为“i'm a”的中,将char*数据成员放在初始化为“i'm a b”的中,并单步执行调试器以监视对象。你应该足够容易地看到这些线。 |
|
Daniel · C#编译器在应该出错时失败 1 年前 |
|
|
Floris · 为什么cpp编译器在类型声明不正确时要转换为int? 1 年前 |
|
obtein · 内存流。写在客户端上有效,但在服务器上无效? 1 年前 |
|
|
kamkow1 · 匿名结构的初始值设定项错误无效 1 年前 |