Создание значения с помощью двух неявных конструкторов?
TLDR: У меня есть два шаблонных классаOuter
а такжеInner
. Inner<X>
может быть неявно построен изX
, а такжеOuter<Y>
может быть неявно построен изY
, ДолженOuter<Inner<X>> = X()
Работа?
Больше деталей:
Предположим, у меня есть следующие два класса:
template<typename T>
class Inner {
public:
Inner(const T& value) {}
Inner(T&& value) {}
};
template<typename T>
class Outer {
public:
Outer(const T& value) {}
Outer(T&& value) {}
};
Рассмотрим следующую функцию:
struct SomeType{};
Outer<Inner<SomeType>> DoSomethingFails() {
SomeType value;
return value;
}
G ++ жалуется:
no viable conversion from 'SomeType' to 'Outer<Inner<SomeType> >'
note: candidate constructor not viable: no known conversion from 'SomeType' to 'const Inner<SomeType> &' for 1st argument
Но если я сделаю следующее вместо этого:
Outer<Inner<SomeType>> DoSomethingWorks() {
SomeType value;
return Inner<SomeType>(value);
}
Оно работает. Разумно ли ожидатьDoSomethingFails
работать? Если нет, то почему? И может ли код быть изменен таким образом, чтобыDoSomethingFails
работает?