После путаницы, почему мой код дал мне ошибку двусмысленности в GCC, но никаких ошибок в Clang, я упростил код. Это видно ниже.
struct Foo
{
// Foo(Foo&&) = delete;
// Foo(const Foo&) = delete;
Foo(int*) {}
};
struct Bar
{
template<typename T>
operator T()
{
return Foo{nullptr};
}
};
int main() { Foo f{Bar{}}; }
Ошибки заключаются в следующем.
main.cpp:17:18: error: call to constructor of 'Foo' is ambiguous
int main() { Foo f{Bar{}}; }
^~~~~~~~
main.cpp:1:8: note: candidate is the implicit move constructor
struct Foo
^
main.cpp:1:8: note: candidate is the implicit copy constructor
main.cpp:5:1: note: candidate constructor
Foo(int*) {}
^
На этот раз я не смог сделать это успешно для Clang, поэтому я полагаю, что это была ошибка Clang, и это предполагаемое поведение.
Когда я явно удаляю копии и перемещаю конструкторы (т.е. раскомментирую верхние две строки кода), я вместо этого получаю
note: candidate constructor has been explicitly deleted
но все еще ошибка. Тогда как я могу пойти по поводу рассогласования строительства здесь?
Обратите внимание, что я специально добавил Foo{nullptr}
вместо просто nullptr
, но нет никакой разницы. То же самое с маркировкой Foo
ctor. Эта ошибка неоднозначность возникает только тогда, когда Bar
оператор преобразования шаблонных.
Я могу добавить SFINAE в оператор преобразования, но я не уверен, что я исключу. Например, это заставило бы его работать:
template<typename T, std::enable_if_t<std::is_same<T, Foo>{}>* = nullptr>
Это еще один, который я нашел, и это может быть моим ответом:
template<typename T, std::enable_if_t<!std::is_same<T, int*>{}>* = nullptr>