【问题标题】:Why does the compiler complains when `none const copy constructor` is used?为什么使用“无 const 复制构造函数”时编译器会报错?
【发布时间】:2020-05-30 06:11:16
【问题描述】:

作为主体,下面的代码是对的。

#include<iostream>

class ABC     
{  public:  
    ABC() 
    {
        std::cout<< "default construction" << std::endl;
    }

    ABC(ABC& a) 
    {
        std::cout << "copy construction" << std::endl;
    } 

};                         

int main()   
{  
   ABC c1 = ABC(); 
}

无法编译成功:

<source>: In function 'int main()': 
<source>:25:13: error: cannot bind non-const lvalue reference of type 'ABC&' to an rvalue of type 'ABC'
   25 |    ABC c1 = ABC();
      |             ^~~~~
<source>:10:14: note:   initializing argument 1 of 'ABC::ABC(ABC&)'
   10 |     ABC(ABC& a)
      |         ~~~~~^

但是,如果将ABC(ABC&amp; a) 替换为ABC(const ABC&amp;),它可以编译。我知道它与关键字const 有一些关系。但我不知道为什么。

您可以在https://godbolt.org/z/jNL5Bd 上查看。我是 C++ 的新手。如果能在这个问题上得到一些帮助,我将不胜感激。

【问题讨论】:

  • clang 与现代设置一起使用时不会发生这种情况。你用的是什么编译器?
  • @tadman 你可以在godbolt.org/z/jNL5Bd 上查看。使用选项“-std=c++11”
  • 当然,但我住在 2020 年,所以我使用现代标准。你坚持使用 C++11 有什么原因吗?如果是这样,请感受一下。
  • @tadman 有很多编译器不支持 C++20,尤其是嵌入式系统。
  • 您这里的代码与您在编译器资源管理器中提供的代码不同。这里的代码没有给出那个错误。不同之处在于为复制构造函数参数指定const

标签: c++ c++11 constructor copy-constructor move-semantics


【解决方案1】:

正如错误消息所说,临时的ABC() 不能绑定到非常量的左值引用,采用ABC&amp; 的复制构造函数不能用于初始化。 (临时变量可以绑定到 const 或 rvalue-reference 的左值引用。)


PS:由于 C++17 代码可​​以编译(这并不意味着复制构造函数采用左值引用非 const 是一种好方法),因为保证了 copy elision,复制构造将被省略完全。

(强调我的)

在以下情况下,编译器需要省略类对象的复制和移动构造,即使复制/移动构造函数和析构函数具有可观察到的副作用。对象直接构建到存储中,否则它们将被复制/移动到。 复制/移动构造函数不需要存在或可访问

【讨论】:

  • 但是仍然没有理由使用带有非常量引用参数的复制构造函数。
  • 在 C++17 中,如果ABC 的复制构造函数接受非const 引用,则序列const ABC a; ABC b = a; 将触发诊断。 C++17 保证省略的事实消除了某些情况,但这并不意味着接受非const 引用的复制构造函数总是合适的。
  • @john 我什至不会称它为复制构造函数,只是一个奇怪的构造函数。
  • @john 为什么?你能详细解释一下吗?
  • 为什么是一个不同的问题。这是否是一个好的规则是有争议的,但彼得在上面的评论中给出了规则背后的哲学。在 C++ 中,您应该始终指出引用、指针或方法是否为 const。它从不伤害,有时会在编译代码和非编译代码之间产生差异。
猜你喜欢
  • 2017-07-20
  • 2022-06-15
  • 1970-01-01
  • 2017-03-26
  • 2015-12-30
  • 1970-01-01
  • 2013-03-24
  • 2013-06-02
  • 1970-01-01
相关资源
最近更新 更多