Вызов перегруженной функции является неоднозначным при использовании списка инициализаторов в качестве параметра конструC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Вызов перегруженной функции является неоднозначным при использовании списка инициализаторов в качестве параметра констру

Сообщение Anonymous »

Когда тип имеет как явный конструктор с одним аргументом, так и конструкторы копирования/перемещения, используя список инициализатора в качестве аргумента, заставляет компилятор добавлять ошибку: ошибка: вызов перегруженного «база ()» является неоднозначным . Подробное сообщение об ошибке и код соблюдается: < /p>
Сообщение об ошибке: < /p>

Код: Выделить всё

: In function 'int main()':
:33:23: error: call of overloaded 'Base(
)' is ambiguous
33 |     Base b({a.shape()});
|                       ^
:24:5: note: candidate: 'constexpr Base::Base(Base&&)'
24 |     Base(Base &&) = default;
|     ^~~~
:23:5: note: candidate: 'constexpr Base::Base(const Base&)'
23 |     Base(const Base &) = default;
|     ^~~~
:22:14: note: candidate: 'Base::Base(const Layout&)'
22 |     explicit Base(const Layout &layout) : m_layout(layout) {}
|              ^~~~
Compiler returned: 1
< /code>
code: < /p>
#include 
#include 
#include 

using IntTuple = std::vector;

class Layout {
IntTuple m_shape;

public:
Layout(const IntTuple &shape) : m_shape(shape) {}
IntTuple shape() {
return m_shape;
}
};

class Base {
Layout m_layout;

public:
explicit Base(const Layout &layout) : m_layout(layout) {}
Base(const Base &) = default;
Base(Base &&) = default;

IntTuple shape() {
return m_layout.shape();
}
};

int main() {
Base a(IntTuple{1, 2, 3});
Base b({a.shape()});  // error
}
< /code>
По моему мнению, явное ключевое слово должно было отключить неявный путь преобразования от списка инициализатора в базовый тип, поэтому эта ошибка не должна происходить. Эта ошибка наблюдается в версиях GCC ниже 13.4, в то время как она успешно компилируется в версиях 14.1 и выше. Я хотел бы знать причину, по которой GCC 13.4 не снимает это. Однако в этом случае существует тонкая разница между примером кода и этим. В этом примере действительно есть два пути разрешения перегрузки, тогда как в этом случае использование явного ограничивает его только одним жизнеспособным путем в принципе. Кроме того, ссылка не объясняет, почему код успешно компилизируется в версиях GCC 14.1 и выше, причем и в модификации базы B ({a.shape ()}); 
на базу b ({a.shape ()}}); разрешить проблему. Поэтому я считаю, что эта проблема все еще требует дальнейшего обсуждения.


Подробнее здесь: https://stackoverflow.com/questions/796 ... st-as-a-co
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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