В конструкторе копирования есть две сомнительные вещи.
Во-первых, вы сделали конструктор копирования явным (что сомнительно), поэтому вам (теоретически) нужно сделать:
Foo d( (Foo()) );
Во-вторых, ваш конструктор копирования принимает ссылку, а не ссылку const
, что означает, что вы не можете использовать его с временным Foo
.
Лично я бы просто удалил explicit
из конструктора копирования и сделал так, чтобы он использовал ссылку const
, если это возможно.
Обратите внимание, что explicit
в вашем конструкторе по умолчанию не имеет никакого эффекта. [*] explicit
влияет только на конструкторы, которые могут быть вызваны с одним параметром. Это предотвращает их использование для неявных преобразований. Для конструкторов, которые принимают только ноль или только два или более параметров, это не действует.
[Примечание: может быть разница между:
Foo d;
и
Foo d = Foo();
но в этом случае у вас есть объявленный пользователем конструктор по умолчанию, поэтому это не применимо.]
Изменить: [*] Я только что дважды проверил это, и в 12.3.1 [class.conv.ctor] сказано, что вы можете создать конструктор по умолчанию explicit
. В этом случае конструктор будет использоваться для выполнения инициализации по умолчанию или инициализации значения. Честно говоря, я не понимаю значения этого, как если бы у вас есть объявленный пользователем конструктор, тогда это не-POD-тип, и даже локальные объекты не-POD-типа инициализируются по умолчанию, если у них нет инициализатора в этом разделе говорится, что это может быть сделано explicit
конструктором по умолчанию. Возможно, кто-то может указать на крайний случай, когда это действительно имеет значение, но пока я не вижу, какое влияние explicit
оказывает на конструктор по умолчанию.
person
CB Bailey
schedule
05.05.2010
Foo (const Foo&)
.Foo d = Foo();
вызывает конструктор копирования. - person Brian Roach   schedule 05.05.2010Foo
, потому что он должен был бы взять копию для входа в конструктор копирования, который будет рекурсивно повторяться бесконечно ... поэтому он предлагает правильную подпись. - person AshleysBrain   schedule 06.05.2010