C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 代码段在Coliru中编译警告,但在Ideone中正常编译.哪一个是正确的?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
代码在Coliru中编译,其警告[在std :: cout中的统一成员a [1] .i和a [2] .i<< main()]中的表达式,但在 Ideone中正常编译.
#include <iostream>

struct A
{
    int i;
    A(int j) : i{j} {};
    A() = default;
};

int main() {
    A a[3] = { A(1) };
    std::cout << a[1].i << ' ' << a[2].i << '\n';
}

根据我对iso§8.5 P7的解释,Ideone是正确的,因为这个条款的第四个要点.

这是N3797的第8.5 P7

解决方法

对于具有认构造函数和另一个认构造函数的类,C 11和N3797之间的值初始化行为有明显的区别. C 11§8.5 / 7:

N3797§8.5 / 8:

你的struct A有一个用户声明的认构造函数A()= default;和用户提供的非认构造函数A(int j):i {j} {}.在C 11中,它受第一个子弹:它有一个用户提供的构造函数,所以认构造函数调用(它什么都不做:A的认构造函数是微不足道的).在N3797中,由于A是“没有用户提供或删除认构造函数”,所以第二个项目符号适用,因此对象为零初始化.

简单地说,在具有任何用户提供的构造函数的类的对象的C 11中的值初始化将不会在认初始化之前执行零初始化.在N3797中,没有用户提供的认构造函数的类的对象的值初始化将在认初始化之前执行零初始化.

看来the version of clang on Coliru一直在跟踪标准C-11,但是GCC 4.8 has not.

编辑:This test program表明GCC 4.8实际上遵循N3797规则进行值初始化.问题似乎是认 – 初始化不提供初始化程序的数组元素,而不是根据标准所要求的值初始化它们.请注意第二个数组元素之间的行为差​​异,第二个数组元素明确提供了一个空的初始化器,而第三个不提供初始化器.

这看起来像一个可能的GCC错误.

编辑:The same test program compiled by the same GCC version on Ideone没有显示错误.不知道这里发生了什么也许不同的编译器标志影响了Ideone上的输出,我不知道如何确定使用的编译器命令行.

大佬总结

以上是大佬教程为你收集整理的c – 代码段在Coliru中编译警告,但在Ideone中正常编译.哪一个是正确的?全部内容,希望文章能够帮你解决c – 代码段在Coliru中编译警告,但在Ideone中正常编译.哪一个是正确的?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。