Этот вопрос почти идентичен Оператор преобразования при прямой инициализации , однако, это то, что я заметил в реализациях.
Рассмотрим следующее:
struct A { A(); A(A&&); };
struct B { operator A(); };
void f()
{
B b;
A a(b);
}
Мое чтение стандарта говорит о том, что из-за этой прямой инициализации, когда типы источника и назначения различаются, рассматриваются только конструкторы.Выбирается конструктор A (A &&), и параметр привязывается к результату функции преобразования, в результате получается всего два вызова: operator A()
, A(A&&)
, как [dcl.init] /17.6.2.1 является единственным подпунктом, применимым здесь.
Однако это не поведение, отображаемое gcc, msvc и clang, или icc, которые все говорят, что вызывается только operator A()
.Правильно ли предположить, что это всего лишь оптимизация компилятора?
Я не вижу причин для того, чтобы конструктор преобразования не использовался здесь исключительно, кроме того факта, что я не могу найти какую-либо формулировку, описывающую это поведение.