В следующем коде есть два конструктора - прямой конструктор из int v и удаляемый const int & Constructor:
struct X
{
X(int v);
X(const int&)=delete;
};
X foo()
{
return X(42);
}
< /code>
Это не может компилироваться, потому что компиляторы (GCC, Clang, MSVC) рассматривают вызов для конструктора двусмысленного: < /p>
:9:12: error: ambiguous conversion for functional-style cast from 'int' to 'X'
return X(42);
^~~~
:3:5: note: candidate constructor
X(int v);
^
:4:5: note: candidate constructor has been explicitly deleted
X(const int&)=delete;
^
< /code>
здесь Clang перечисляет всех возможных кандидатов, которые он рассматривал. Список GCC отличается, но даже при удалении всех конструкторов, кроме одного, они все считают таким образом неоднозначным. На мой взгляд, нет двусмысленности.struct X
{
X(int v);
X(const int&)=delete;
X(int&&)=delete;
X(const X&)=delete;
X(X&&)=delete;
};
X foo()
{
return X{int(42)};
}
< /code>
создает ту же ошибку с более длинным списком кандидатов. Все основные компиляторы отклоняют этот код - GCC, Clang, MSVC. И я вижу преимущества этого. Однако я не могу сопоставить это поведение в стандарт.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -candidate