Почему компилятор жалуется, когда используется `none const copy constructor`? - PullRequest
1 голос
/ 30 мая 2020

Что касается темы, приведенный ниже код правильный.

#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& a) на ABC(const ABC&). Я знаю, что это имеет какое-то отношение к ключевому слову const. Но я не мог понять, почему.

Вы можете проверить это на https://godbolt.org/z/jNL5Bd. Я новичок в C ++. Буду признателен за помощь в этом вопросе.

1 Ответ

1 голос
/ 30 мая 2020

Как сказано в сообщении об ошибке, временный ABC() не может быть привязан к lvalue-ссылке к неконстантному, конструктор копирования, принимающий ABC&, не может использоваться для инициализации. (Временные файлы могут быть привязаны к lvalue-reference к const или rvalue-reference.)


PS: Начиная с C ++ 17 код будет компилироваться (что не означает, что конструктор копирования принимает lvalue-ссылку to non-const - хороший способ), поскольку copy elision гарантирован, конструкция копирования будет полностью исключена.

(выделено мной)

Under В следующих случаях компиляторы должны опускать конструкцию копирования и перемещения объектов класса, , даже если конструктор копирования / перемещения и деструктор имеют наблюдаемые побочные эффекты . Объекты создаются непосредственно в хранилище, куда они в противном случае были бы скопированы / перемещены. Конструкторы копирования / перемещения не обязательно должны присутствовать или доступны :

...