Похоже, что Visual Studio пока не реализует P0136 . Правильное поведение C ++ 17 - это одна копия, правильное поведение C ++ 14 - две копии.
<ч />
Правила C ++ 14 ( N4140: [class.inhctor] ) будут интерпретировать:
struct B : A
{
using A::A;
};
как:
struct B : A
{
B(Foo f) : A(f) { }
};
Введенные конструкторы указаны в p3, эквивалентность mem-инициализатора в p8. Следовательно, вы получаете две копии Foo
: одну в синтезированный конструктор B
и одну в реальный конструктор A
.
<ч />
Правила C ++ 17, в результате P0136, очень разные ( N4659: [class.inhtor.init] ): там мы напрямую вызываем конструктор A
. Мы больше не добавляем новый конструктор в B
- и это не механизм, который иначе выражается в языке. И поскольку мы напрямую вызываем A(Foo)
, это всего лишь одна копия вместо двух.