Сообщение об ошибке: < /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 ()});
Подробнее здесь: https://stackoverflow.com/questions/796 ... st-as-a-co