不,因为复制省略(以及所谓的保证复制省略)可以改变“构造后”对象的常量:
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
应该是什么?
实际上,构造函数永远不会构造 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 对象发生的事情根本不是构造函数的事。