Construindo um valor através de dois construtores implícitos?

TLDR: Eu tenho duas classes modeloOuter eInner. Inner<X> pode ser implicitamente construído a partir deXeOuter<Y> pode ser implicitamente construído a partir deY. DevemosOuter<Inner<X>> = X() trabalhos?

Mais detalhes:

Suponha que eu tenha as duas classes a seguir:

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) {}
};

Considere a seguinte função:

struct SomeType{};
Outer<Inner<SomeType>> DoSomethingFails() {
  SomeType value;
  return value;      
}

O g ++ reclama:

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

Mas se eu fizer o seguinte:

Outer<Inner<SomeType>> DoSomethingWorks() {
  SomeType value;
  return Inner<SomeType>(value);      
}

Funciona. É razoável esperarDoSomethingFails trabalhar? Se não, por que? E o código pode ser alterado de uma maneira queDoSomethingFails trabalho?

questionAnswers(1)

yourAnswerToTheQuestion