Создание значения с помощью двух неявных конструкторов?

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 работает?

Ответы на вопрос(1)

Ваш ответ на вопрос