2015-01-18 2 views
1

Когда я объявляю свой конструктор копий явным, вызов его с помощью = вместо() не компилируется. Вот мой код:Синтаксис вызова конструктора явного копирования

class Base 
{ 
    public: 
     explicit Base(){cout<<__PRETTY_FUNCTION__<<endl;} 
     explicit Base(Base& b){cout <<__PRETTY_FUNCTION__<<endl;} 
}; 

int main() 
{ 
    Base a; 
    Base b=a; 
} 

Компилятор говорит:

error: no matching function for call to ‘Base::Base(Base&)’

Если изменить его

Base b(a); 

Он отлично компилируется. Я думал, что C++ считает эти два стиля экземпляров одинаковыми. Если я удаляю явное ключевое слово, он работает в обоих направлениях. Я предполагаю, что происходит некоторое неявное преобразование, когда я использую =. Так что мне здесь не хватает?

+3

Это не то же самое. Первая - прямая инициализация, другая - копирование-инициализация. Конструкторы 'explicit 'не могут быть выбраны последними. –

+0

PLS делает ваш конструктор копий принимать аргументы 'const &' – TemplateRex

+1

Первоначально он был, но ошибка компилятора (выше) показывала не const. Поэтому просто для того, чтобы исключить это как возможность, я подобрал то, что показывал компилятор. –

ответ

3

Нет, они не то же самое. C++ Стандартной секции § 12.3.1 [class.conv.ctor]

An explicit constructor constructs objects just like non-explicit constructors, but does so only where the direct-initialization syntax (8.5) or where casts (5.2.9, 5.4) are explicitly used


Base b(a); // Direct initialization 
Base b=a; // Copy initialization 

инициализация копирования (с помощью =) не считает явных конструкторов, но прямая инициализация (с помощью ()) делает ,

Вам нужно будет использовать трансляцию или сделать ваш конструктор не явным, если вы хотите использовать инициализацию копирования.

+0

Итак, для не встроенных типов это то же самое, что предположить, что() всегда обеспечивает лучшую производительность, чем =, поскольку последний пытается сделать неявное преобразование? –

+1

@SyedH Я предлагаю вам прочитать [этот ответ] (http://stackoverflow.com/a/1051468/3510483) для полного обзора различий – quantdev

+0

Ух, есть ужасная редакционная ошибка в этом стандартном тексте, присутствующая на C++ 11 и C++ 14 и последний проект. –

Смежные вопросы