gpt4 book ai didi

c++ - 为什么 C++ 需要用户提供的默认构造函数来默认构造一个 const 对象?

转载 作者:行者123 更新时间:2023-12-03 10:06:14 24 4
gpt4 key购买 nike

C++ 标准(第 8.5 节)说:

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.



为什么?我想不出在这种情况下为什么需要用户提供的构造函数的任何原因。
struct B{
B():x(42){}
int doSomeStuff() const{return x;}
int x;
};

struct A{
A(){}//other than "because the standard says so", why is this line required?

B b;//not required for this example, just to illustrate
//how this situation isn't totally useless
};

int main(){
const A a;
}

最佳答案

原因是如果这个类没有自定义的构造函数,那么就可以是POD,POD类默认是不初始化的。那么如果你声明一个未初始化的 POD 常量对象,它有什么用呢?所以我认为标准强制执行这个规则,以便对象实际上是有用的。

struct POD
{
int i;
};

POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!

POD p2 = POD(); //initialized

const POD p3 = POD(); //initialized

const POD p4; //uninitialized - error - as we cannot change it later on!

但是,如果您将类设为非 POD:
struct nonPOD_A
{
nonPOD_A() {} //this makes non-POD
};

nonPOD_A a1; //initialized
const nonPOD_A a2; //initialized

请注意 POD 和非 POD 之间的区别。

用户定义的构造函数是使类成为非 POD 的一种方法。有几种方法可以做到这一点。
struct nonPOD_B
{
virtual void f() {} //virtual function make it non-POD
};

nonPOD_B b1; //initialized
const nonPOD_B b2; //initialized

注意 nonPOD_B 没有定义用户定义的构造函数。编译它。它将编译:
  • http://www.ideone.com/h7TsA

  • 并评论虚函数,然后它会给出错误,正如预期的那样:
  • http://www.ideone.com/SWk7B


  • 好吧,我想,你误解了这段话。它首先是这样说的(第 8.5/9 节):

    If no initializer is specified for an object, and the object is of (possibly cv-qualified) non-POD class type (or array thereof), the object shall be default-initialized; [...]



    它谈论非 POD 类可能是 cv 限定的类型。也就是说,如果没有指定初始化程序,则非 POD 对象应默认初始化。什么是默认初始化?对于非 POD,规范说 (§8.5/5),

    To default-initialize an object of type T means:
    — if T is a non-POD class type (clause 9), the default constructor for T is called (and the initialization is ill-formed if T has no accessible default constructor);



    它只是谈论 T 的默认构造函数,无论是用户定义的还是编译器生成的都无关紧要。

    如果您清楚这一点,那么请了解规范接下来说的是什么((第 8.5/9 节),

    [...]; if the object is of const-qualified type, the underlying class type shall have a user-declared default constructor.



    所以本文暗示,程序将是格式错误的 如果 该对象是 const 限定的 POD 类型,并且没有指定初始化程序(因为 POD 没有默认初始化):
    POD p1; //uninitialized - can be useful - hence allowed
    const POD p2; //uninitialized - never useful - hence not allowed - error

    顺便说一句, this compiles fine ,因为它是非 POD,并且可以默认初始化。

    关于c++ - 为什么 C++ 需要用户提供的默认构造函数来默认构造一个 const 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64969302/

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