Явные конструкторы копирования запрещают что-то вроде Foo foo = bar;
и применяют использование копии как Foo foo(bar);
. Кроме того, явные конструкторы копирования также запрещают возвращать объекты по значению из функции. Однако я попытался заменить инициализацию копии фигурными скобками, например
struct Foo
{
Foo() = default;
explicit Foo(const Foo&) = default;
};
int main()
{
Foo bar;
Foo foo{bar}; // error here
}
и я получаю ошибку (g++ 5.2)
error: нет соответствующей функции для вызова в Foo:: Foo (Foo &) '
или (clang++)
ошибка: избыточные элементы в инициализаторе структуры
Удаление explicit
делает компилируемый код под g++, clang++ все еще терпит неудачу с той же ошибкой (спасибо @Steephen). Что здесь происходит? Является ли равномерная инициализация рассмотренной как конструктор списка инициализаторов (который превосходит все остальные)? Но если это так, почему компиляция программы, когда конструктор копирования не явный?