gpt4 book ai didi

c++ - 下面显示的片段在 Coliru 和 Ideone 中编译,但根据 iso § 8.5 p6 它不应该,或者我错过了什么?

转载 作者:可可西里 更新时间:2023-11-01 16:39:57 24 4
gpt4 key购买 nike

从 C++11 标准 § 8.5 p6 我们有:

If a program calls for the default initialization of an object of a const-qualified type T, T shall be a class type with a user-provided default constructor.

下面的代码应该编译。但在 Coliru 和 Ideone 中确实如此.

class A{};

int main() {
const A a;
}

编辑:

在试图理解这里发生的事情时,我最终得到了以下代码,它可以编译(至少它符合标准,因为 A 有一个用户提供的构造函数) .但随后我想到了以下问题:哪个标准子句确实保证 a.b.j 初始化为 0(参见 Ideone 中的代码),如下所示?

#include <iostream>
struct B { int j; B(){ std::cout << "B()" << '\n'; } };
struct A
{
struct B b;
int i;

public:
A(): i(1) { std::cout << "A()" << '\n'; }

};

int main() {
const A a;
std::cout << a.b.j << '\n';
std::cout << a.i << '\n';
}

编辑1:

很抱歉上面的编辑,但我仍然没有使用 Unix。上周Dietmar Kühl提醒我注意 "Most UNIXes start off with zero initialized pages" .因此,正如我所想的那样,由于初始化,a.b.j 不为 0。事实上,我刚刚用 VS2010 编译了代码,结果 a.b.j 是一个单元化值,正如预期的那样。因此,Edit 中的问题应该被忽略。

但我很想知道 clang++ 或 g++ 是否也会对第二个代码段显示错误。谢谢。

最佳答案

研究了初始化和聚合的规则后,我得出结论,您是对的 — 在技术上是错误的。

您的编译器正在走捷径,因为没有成员,因此实际上不需要初始化。 (有趣的是,the ancient GCC 4.1.2 rejects the program。)

不幸的是,我没有什么可引用的,因为在这种情况下根本没有规则覆盖 [C++11: 8.5/6]

至于为什么标准不允许这样做,为什么要这样呢?空类几乎没有用,我看不出有什么理由主动为更广泛、更有用的类编写豁免 rule对于这种边缘情况。

关于c++ - 下面显示的片段在 Coliru 和 Ideone 中编译,但根据 iso § 8.5 p6 它不应该,或者我错过了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20909693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com