Конструктор неоднозначен, однако есть только один кандидатC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Конструктор неоднозначен, однако есть только один кандидат

Сообщение Anonymous »

В следующем коде есть два конструктора - прямой конструктор из 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»