【问题标题】:Discarding const qualifier丢弃 const 限定符
【发布时间】:2015-05-28 16:28:22
【问题描述】:

为什么不允许丢弃 const 限定符?假设我们写了:

#include <iostream>

struct A
{
    void operator=(const A&){ std::cout << "A&" << std::endl; }
    void operator=(const A&&){ std::cout << "A&&" << std::endl; }
};

const A a;
A b;

int main()
{
    a = b; //Error: discarding qualifier
}

不能在标准不允许的地方提供参考吗?

【问题讨论】:

  • 为什么要允许?这样你就可以改变 const?那会让const 变得毫无意义。
  • @juanchopanza 那么为什么下面的coliru.stacked-crooked.com/a/f094f8dad70b4c5f 完全有效?
  • 正如 juanchopanza 所说。为什么在这种情况下使用const?这似乎是在问为什么将int 传递给需要std::string 的函数时可能会出错。
  • @St.Antario 你认为你的例子有什么问题?
  • @St.Antario 因为A::foo()const

标签: c++ class operator-keyword


【解决方案1】:

问题在于aconst,因此应该修改被调用对象的operator= 是不允许的。这是由const-正确性引起的。

operator= 声明为const 没有意义,因为operator= 的语义是它应该使用右侧值修改调用它的对象并返回一个T&amp; 对左侧对象,如果左侧对象为 const(不包括 const_cast 用法),则这是不可能的。

另一方面,以下是允许的:

int main()
{
    A b;
    const A a = b;
}

因为在这种情况下它是 构造 一个新的常量对象。


正如您所说,该标准在 §9.3.2/3 中使用以下措辞对此进行了规定:

只有当对象表达式的 cv 限定或低于成员函数的 cv 限定时,才能在对象表达式 (5.2.5) 上调用 cv 限定的成员函数。

【讨论】:

  • 我只是在寻找这行文字。 只有当对象表达式与成员函数一样具有 cv 限定或更少 cv 限定时,才能在对象表达式 (5.2.5) 上调用具有 cv 限定的成员函数。 Wasn'提供这些就那么难吗?
  • 我的意思是,您可以将其添加到答案中。
  • @St.Antario 当然我可以将其添加到答案中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多