【问题标题】:Can a C++ constructor know whether it's constructing a const object?C++ 构造函数可以知道它是否在构造一个 const 对象吗?
【发布时间】:2021-09-14 13:52:14
【问题描述】:

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

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

被关于this question的讨论中的一个要点所激励。

【问题讨论】:

  • 那次讨论让我写信给this。看起来 gcc 之后出于某种原因将缓冲区归零。 Nerd Sniping 是一回事!
  • 对于您的用例,构造函数enum Tag { Mut, Const }; 是否可以接受?所以你会这样做 Foo foo{Mut};Foo const cfoo{Const}; ... 这意味着它是手动的,如果有人搞砸了,追踪错误会很烦人。
  • @AyxanHaqverdili:我不确定该程序与问题的关系,但是 - 如果我没记错的话,从对象被破坏的位置读取是未定义的行为。
  • @Eljay:显然,如果你告诉你的构造函数你正在构造什么,它可以马上告诉你。没有作弊...
  • 使用将对象指针传递给构造函数的已删除答案需要一个醒目的名称。我建议 CUCP “奇怪的不常见的构造函数模式”。关于Ayxan的书呆子狙击:程序员只值一分。

标签: c++ reflection constants construction


【解决方案1】:

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

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.cy.c 应该是什么?

【讨论】:

  • 你的例子有点无聊,因为xy 只创建一次(通过变量定义),因此它们的常量不会改变。
  • @LanguageLawyer:我认为用纯右值来说明会更清楚,它只有一组语义,尽管很难说非物化纯右值的常量意味着什么。如果您切换到 NRVO,您(可以)获得多个具有不同 cv 限定的非引用变量,它们都是同一个对象,尽管有人可能会争辩说这也不是完全“改变”。跨度>
猜你喜欢
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 2014-03-17
  • 2010-09-23
  • 2011-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多