C++ 构造函数可以知道它是否正在构造 const 对象吗?

问题描述 投票:0回答:2

在 C++ 中,对象构造函数不能是 const 限定的。

但是 - 类

A
的对象的构造函数可以知道它是在构造
const A
还是非常量
A
吗?

受到有关这个问题的讨论中的一个要点的启发。

c++ reflection constants construction
2个回答
3
投票

不,因为复制省略(以及所谓的保证复制省略)可以改变“构造后”对象的常量:

struct A {
  bool c;
  A() : c(magic_i_am_const()) {}
  A(const A&)=delete;      // immovable
};

const A f() {return {};}
A g() {return f();}        // OK
void h() {
  A x=f();                 // OK
  const A y=g();           // OK
}

x.c
y.c
应该是什么?


0
投票

实际上,构造函数永远不会构造 const 对象。从允许构造函数代码更改对象的意义上来说,该对象在构造期间不是

const
。如果您从构造函数内调用方法 - 它们将是方法的非常量变体。

因此,在这段代码中:

struct A {
    int foo() const { return 123; }
    int foo()       { return 456; }
    A() { x = foo(); }
    int x;
};

int bar() {
    A a;
    return a.x;
}

int baz() {
    A const a;
    return a.x;
}

两个功能,

bar()
baz()
,返回
456
- 根据所有主要编译器(GodBolt)。

constructed 对象发生的事情根本不是构造函数的事。

© www.soinside.com 2019 - 2024. All rights reserved.