Прямая инициализация с функциями преобразования - PullRequest
1 голос
/ 26 сентября 2019

Этот вопрос почти идентичен Оператор преобразования при прямой инициализации , однако, это то, что я заметил в реализациях.

Рассмотрим следующее:

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().Правильно ли предположить, что это всего лишь оптимизация компилятора?

Я не вижу причин для того, чтобы конструктор преобразования не использовался здесь исключительно, кроме того факта, что я не могу найти какую-либо формулировку, описывающую это поведение.

1 Ответ

1 голос
/ 26 сентября 2019

Это, по сути, все вышеупомянутые компиляторы, которые реализуют направление в CWG Issue 2327 .Вы правы, что в настоящее время нет формулировок, позволяющих наблюдать за вашим поведением.Но, как отмечается в проблеме, было бы действительно хорошо, если бы это было так.Но компиляторы могут и делают реализацию elision ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...